From 2bf174d8ffc9c37de42796767fc2a70a03f9a275 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Wed, 6 Aug 2025 18:08:30 +0800 Subject: [PATCH 1/8] CreateFileW does not return a status It would say CreateFileW failed STATUS_SUCCESS. Signed-off-by: Daniel Schaefer --- FrameworkSensors/EcCommunication.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FrameworkSensors/EcCommunication.cpp b/FrameworkSensors/EcCommunication.cpp index 00015c3..7131f6f 100644 --- a/FrameworkSensors/EcCommunication.cpp +++ b/FrameworkSensors/EcCommunication.cpp @@ -33,7 +33,7 @@ NTSTATUS ConnectToEc( NULL); if (*Handle == INVALID_HANDLE_VALUE) { - TraceError("%!FUNC! CreateFileW failed %!STATUS!", Status); + TraceError("%!FUNC! CreateFileW failed"); return STATUS_INVALID_HANDLE; } From 5801e6feefa744f1639dd272bc7632bbafb7d15a Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Wed, 6 Aug 2025 19:06:03 +0800 Subject: [PATCH 2/8] Dynamically connect to EC If the EC driver is not installed or runinng when the sensor driver starts, need to fail gracefully instead of preventing driver start and yellow bang. So instead we keep checking and connect to the EC at the first chance. Signed-off-by: Daniel Schaefer --- FrameworkSensors/AccelerometerClient.cpp | 61 ++++++++++++++++-------- FrameworkSensors/Clients.cpp | 3 ++ FrameworkSensors/Device.cpp | 36 +------------- FrameworkSensors/EcCommunication.cpp | 7 +++ 4 files changed, 52 insertions(+), 55 deletions(-) diff --git a/FrameworkSensors/AccelerometerClient.cpp b/FrameworkSensors/AccelerometerClient.cpp index 8226095..57a902a 100644 --- a/FrameworkSensors/AccelerometerClient.cpp +++ b/FrameworkSensors/AccelerometerClient.cpp @@ -38,14 +38,18 @@ typedef enum ACCELEROMETER_DATA_COUNT } ACCELEROMETER_DATA_INDEX; -UINT8 CrosEcGetMotionSensorCount(HANDLE Handle) +NTSTATUS CrosEcGetMotionSensorCount(HANDLE Handle, UINT8 *Count) { EC_REQUEST_MOTION_SENSE_DUMP req{}; EC_RESPONSE_MOTION_SENSE_DUMP res{}; if (Handle == INVALID_HANDLE_VALUE) { TraceError("%!FUNC! Handle is invalid"); - return 0; + return STATUS_INVALID_PARAMETER; + } + if (Count == nullptr) { + TraceError("%!FUNC! Count==NULL"); + return STATUS_INVALID_PARAMETER; } req.Cmd = 0; @@ -60,21 +64,21 @@ UINT8 CrosEcGetMotionSensorCount(HANDLE Handle) sizeof(res) )) { TraceError("%!FUNC! EC_CMD_MOTION_SENSE_DUMP failed"); - return 0; + return STATUS_NOT_FOUND; } - return res.SensorCount; + *Count = res.SensorCount; + return STATUS_SUCCESS; } // Returns STATUS_NOT_FOUND if either base or lid accelerometer sensors are not found. NTSTATUS -CrosEcGetAccelIndeces(HANDLE Handle, UINT8 *BaseSensor, UINT8 *LidSensor) +CrosEcGetAccelIndeces(HANDLE Handle, UINT8 *BaseSensor, UINT8 *LidSensor, UINT8 SensorCount) { EC_REQUEST_MOTION_SENSE_INFO req{}; EC_RESPONSE_MOTION_SENSE_INFO res{}; BOOLEAN FoundBase = FALSE; BOOLEAN FoundLid = FALSE; - UINT8 SensorCount = 0; if (Handle == INVALID_HANDLE_VALUE) { TraceError("%!FUNC! Handle is invalid"); @@ -87,8 +91,6 @@ CrosEcGetAccelIndeces(HANDLE Handle, UINT8 *BaseSensor, UINT8 *LidSensor) return STATUS_INVALID_PARAMETER; } - SensorCount = CrosEcGetMotionSensorCount(Handle); - for (UINT8 i = 0; i < SensorCount; i++) { req.Cmd = 1; @@ -164,24 +166,36 @@ AccelerometerDevice::Initialize( m_Device = Device; m_SensorInstance = SensorInstance; m_Started = FALSE; + SensorCount = 0; // Sensible defaults - applies to most devices m_LidSensorIndex = 0; m_LidBaseSensor = 1; + Context->m_CrosEcHandle = INVALID_HANDLE_VALUE; - SensorCount = CrosEcGetMotionSensorCount(Context->m_CrosEcHandle); + // Make sure we have a handle to the EC driver + ConnectToEc(&Context->m_CrosEcHandle); + + Status = CrosEcGetMotionSensorCount(Context->m_CrosEcHandle, &SensorCount); TraceInformation("%!FUNC! Found %d Sensors on this device", SensorCount); - if (SensorCount == 0) + // If the EC is present, we evaluate the responses, + // If not just ignore it and try again later. + // Want to avoid failing the driver load if the EC is not present. + if (NT_SUCCESS(Status)) { - TraceError("%!FUNC! No Sensors available. Not initializing AccelerometerClient"); - Status = STATUS_NOT_FOUND; - goto Exit; - } + if (SensorCount == 0) + { + TraceError("%!FUNC! No Sensors available. Not initializing AccelerometerClient"); + Status = STATUS_NOT_FOUND; + goto Exit; + } - Status = CrosEcGetAccelIndeces(Context->m_CrosEcHandle, &m_LidSensorIndex, &m_LidBaseSensor); - if (!NT_SUCCESS(Status)) - { - TraceError("%!FUNC! Failed to get accelerometer indeces: %!STATUS!", Status); - goto Exit; + Status = CrosEcGetAccelIndeces(Context->m_CrosEcHandle, &m_LidSensorIndex, &m_LidBaseSensor, SensorCount); + if (!NT_SUCCESS(Status)) + { + TraceError("%!FUNC! Failed to get accelerometer indeces: %!STATUS!", Status); + Status = STATUS_NOT_FOUND; + goto Exit; + } } // @@ -515,6 +529,13 @@ AccelerometerDevice::GetData( SENSOR_FunctionEnter(); + if (Handle == INVALID_HANDLE_VALUE) { + TraceError("%!FUNC! Handle is invalid"); + return STATUS_INVALID_HANDLE; + } + + // TODO: Might want to check if sensor indeces are initialized + UINT8 acc_status = 0; CrosEcReadMemU8(Handle, EC_MEMMAP_ACC_STATUS, &acc_status); TraceInformation("Status: (%02x), Present: %d, Busy: %d\n", @@ -663,4 +684,4 @@ AccelerometerDevice::UpdateCachedThreshold( Exit: SENSOR_FunctionExit(Status); return Status; -} \ No newline at end of file +} diff --git a/FrameworkSensors/Clients.cpp b/FrameworkSensors/Clients.cpp index 4673356..4374951 100644 --- a/FrameworkSensors/Clients.cpp +++ b/FrameworkSensors/Clients.cpp @@ -10,6 +10,7 @@ // Windows User-Mode Driver Framework (WUDF) #include "Clients.h" +#include "EcCommunication.h" #include "Clients.tmh" @@ -47,6 +48,8 @@ OnTimerExpire( // Get data and push to clx Lock(pDevice->m_Lock); + // Make sure we have a handle to the EC driver + ConnectToEc(&pDevice->m_CrosEcHandle); Status = pDevice->GetData(pDevice->m_CrosEcHandle); if (!NT_SUCCESS(Status) && Status != STATUS_DATA_NOT_ACCEPTED) { diff --git a/FrameworkSensors/Device.cpp b/FrameworkSensors/Device.cpp index c946fe0..de860d7 100644 --- a/FrameworkSensors/Device.cpp +++ b/FrameworkSensors/Device.cpp @@ -219,43 +219,9 @@ OnPrepareHardware( ) { NTSTATUS Status = STATUS_SUCCESS; - ULONG i; - HANDLE Handle; - DWORD retb{}; - CROSEC_READMEM rm{}; SENSOR_FunctionEnter(); - Status = ConnectToEc(&Handle); - if (!NT_SUCCESS(Status)) { - TraceError("COMBO %!FUNC! ConnectToEc failed %!STATUS!", Status); - goto Exit; - } - - rm.bytes = 0xfe; - rm.offset = 0; - Status = DeviceIoControl(Handle, - (DWORD) IOCTL_CROSEC_RDMEM, - &rm, - sizeof(rm), - &rm, - sizeof(rm), - &retb, - nullptr); - if (!NT_SUCCESS(Status)) { - TraceError("COMBO %!FUNC! ConnectToEc failed %!STATUS!", Status); - goto Exit; - } - - UINT8 *EcMem = rm.buffer; - for (i = 0; i < 0xfe-16; i+=16) { - TraceInformation( - "%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", - EcMem[i], EcMem[i+1], EcMem[i+2], EcMem[i+3], EcMem[i+4], EcMem[i + 5], EcMem[i + 6], EcMem[i + 7], - EcMem[i + 8], EcMem[i+9], EcMem[i+10], EcMem[i+11], EcMem[i+12], EcMem[i + 13], EcMem[i + 14], EcMem[i + 15] - ); - } - for (ULONG Count = 0; Count < SensorInstanceCount; Count++) { PComboDevice pDevice = nullptr; @@ -285,7 +251,7 @@ OnPrepareHardware( AllocateDeviceAtIndex(Count, &pDevice); - pDevice->m_CrosEcHandle = Handle; + pDevice->m_CrosEcHandle = INVALID_HANDLE_VALUE; // Fill out properties Status = pDevice->Initialize(Device, SensorInstance); diff --git a/FrameworkSensors/EcCommunication.cpp b/FrameworkSensors/EcCommunication.cpp index 7131f6f..c00f42f 100644 --- a/FrameworkSensors/EcCommunication.cpp +++ b/FrameworkSensors/EcCommunication.cpp @@ -23,6 +23,12 @@ NTSTATUS ConnectToEc( ) { NTSTATUS Status = STATUS_SUCCESS; + if (*Handle != INVALID_HANDLE_VALUE) { + // Already connected + TraceError("%!FUNC! Already connected"); + return Status; + } + *Handle = CreateFileW( LR"(\\.\GLOBALROOT\Device\CrosEC)", GENERIC_READ | GENERIC_WRITE, @@ -37,6 +43,7 @@ NTSTATUS ConnectToEc( return STATUS_INVALID_HANDLE; } + TraceInformation("%!FUNC! Got Handle"); return Status; } From 102869a8f5de7ba2c1e9685680a355e0f96348d0 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Wed, 6 Aug 2025 19:08:20 +0800 Subject: [PATCH 3/8] Bump version to 0.0.7.0 Signed-off-by: Daniel Schaefer --- FrameworkSensors/FrameworkSensors.inx | 2 +- FrameworkSensors/FrameworkSensors.vcxproj | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/FrameworkSensors/FrameworkSensors.inx b/FrameworkSensors/FrameworkSensors.inx index 64166c2..f2a0ce3 100644 --- a/FrameworkSensors/FrameworkSensors.inx +++ b/FrameworkSensors/FrameworkSensors.inx @@ -16,7 +16,7 @@ Class = Sensor ClassGuid = {5175D334-C371-4806-B3BA-71FD53C9258D} Provider = %PROVIDER% CatalogFile = FrameworkSensors.cat -DriverVer = 2/19/2025,0.0.0.6 +DriverVer = 2/19/2025,0.0.7.0 PnpLockdown = 1 [SourceDisksNames] diff --git a/FrameworkSensors/FrameworkSensors.vcxproj b/FrameworkSensors/FrameworkSensors.vcxproj index 2be76a8..5963940 100644 --- a/FrameworkSensors/FrameworkSensors.vcxproj +++ b/FrameworkSensors/FrameworkSensors.vcxproj @@ -124,7 +124,7 @@ %(AdditionalDependencies);mincore.lib;propsys.lib;$(WDK_UM_LIB_PATH)\sensors\1.1\sensorscxstub.lib;sensorsutils.lib - 0.0.0.6 + 0.0.7.0 sha256 @@ -150,7 +150,7 @@ %(AdditionalDependencies);mincore.lib;propsys.lib;$(WDK_UM_LIB_PATH)\sensors\1.1\sensorscxstub.lib;sensorsutils.lib - 0.0.0.6 + 0.0.7.0 sha256 @@ -176,7 +176,7 @@ %(AdditionalDependencies);mincore.lib;propsys.lib;$(WDK_UM_LIB_PATH)\sensors\1.1\sensorscxstub.lib;sensorsutils.lib - 0.0.0.6 + 0.0.7.0 sha256 @@ -202,7 +202,7 @@ %(AdditionalDependencies);mincore.lib;propsys.lib;$(WDK_UM_LIB_PATH)\sensors\1.1\sensorscxstub.lib;sensorsutils.lib - 0.0.0.6 + 0.0.7.0 sha256 From 6ac33dd34ef591ed36ff137f5a165f869af612c8 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Wed, 6 Aug 2025 19:34:27 +0800 Subject: [PATCH 4/8] Fix base/lid sensor determination Signed-off-by: Daniel Schaefer --- FrameworkSensors/AccelerometerClient.cpp | 6 +++--- FrameworkSensors/Clients.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/FrameworkSensors/AccelerometerClient.cpp b/FrameworkSensors/AccelerometerClient.cpp index 57a902a..d0efd40 100644 --- a/FrameworkSensors/AccelerometerClient.cpp +++ b/FrameworkSensors/AccelerometerClient.cpp @@ -73,7 +73,7 @@ NTSTATUS CrosEcGetMotionSensorCount(HANDLE Handle, UINT8 *Count) // Returns STATUS_NOT_FOUND if either base or lid accelerometer sensors are not found. NTSTATUS -CrosEcGetAccelIndeces(HANDLE Handle, UINT8 *BaseSensor, UINT8 *LidSensor, UINT8 SensorCount) +CrosEcGetAccelIndeces(HANDLE Handle, UINT8 *LidSensor, UINT8 *BaseSensor, UINT8 SensorCount) { EC_REQUEST_MOTION_SENSE_INFO req{}; EC_RESPONSE_MOTION_SENSE_INFO res{}; @@ -169,7 +169,7 @@ AccelerometerDevice::Initialize( SensorCount = 0; // Sensible defaults - applies to most devices m_LidSensorIndex = 0; - m_LidBaseSensor = 1; + m_BaseSensor = 1; Context->m_CrosEcHandle = INVALID_HANDLE_VALUE; // Make sure we have a handle to the EC driver @@ -189,7 +189,7 @@ AccelerometerDevice::Initialize( goto Exit; } - Status = CrosEcGetAccelIndeces(Context->m_CrosEcHandle, &m_LidSensorIndex, &m_LidBaseSensor, SensorCount); + Status = CrosEcGetAccelIndeces(Context->m_CrosEcHandle, &m_LidSensorIndex, &m_BaseSensor, SensorCount); if (!NT_SUCCESS(Status)) { TraceError("%!FUNC! Failed to get accelerometer indeces: %!STATUS!", Status); diff --git a/FrameworkSensors/Clients.h b/FrameworkSensors/Clients.h index db0780f..d8f15c2 100644 --- a/FrameworkSensors/Clients.h +++ b/FrameworkSensors/Clients.h @@ -222,7 +222,7 @@ typedef class _AccelerometerDevice : public _ComboDevice AccelerometerSample m_CachedData; AccelerometerSample m_LastSample; UINT8 m_LidSensorIndex; - UINT8 m_LidBaseSensor; + UINT8 m_BaseSensor; public: From 9d48c554bc3aca85aad6868eb0f98babade7b7f5 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Wed, 6 Aug 2025 19:34:52 +0800 Subject: [PATCH 5/8] ConnectToEc: Bail if passed nullptr Signed-off-by: Daniel Schaefer --- FrameworkSensors/EcCommunication.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/FrameworkSensors/EcCommunication.cpp b/FrameworkSensors/EcCommunication.cpp index c00f42f..e797797 100644 --- a/FrameworkSensors/EcCommunication.cpp +++ b/FrameworkSensors/EcCommunication.cpp @@ -21,12 +21,15 @@ NTSTATUS ConnectToEc( _Inout_ HANDLE* Handle ) { - NTSTATUS Status = STATUS_SUCCESS; + if (Handle == NULL) { + TraceError("%!FUNC! Handle pointer is NULL"); + return STATUS_INVALID_PARAMETER; + } if (*Handle != INVALID_HANDLE_VALUE) { // Already connected TraceError("%!FUNC! Already connected"); - return Status; + return STATUS_SUCCESS; } *Handle = CreateFileW( @@ -44,7 +47,7 @@ NTSTATUS ConnectToEc( } TraceInformation("%!FUNC! Got Handle"); - return Status; + return STATUS_SUCCESS; } int CrosEcSendCommand( From c42a5da3b1fdf21c74895813d76078c3df775607 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Sun, 18 Jan 2026 04:18:32 +0800 Subject: [PATCH 6/8] OnD0Exit: Close EC handle before sleep When suspending (D0 exit) close the handle to the EC driver so that we open it again after resume and get a fresh one. Because if the EC driver restarts during sleep, we cannot keep using the old handle pointing to the unloaded driver. This change just closes it, re-opening is already handled in OnTimerExpire when the device wakes. This fixes the HLK "DF - Sleep with IO during (Reliability)" test failure. Signed-off-by: Daniel Schaefer --- FrameworkSensors/Device.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/FrameworkSensors/Device.cpp b/FrameworkSensors/Device.cpp index de860d7..c5197b0 100644 --- a/FrameworkSensors/Device.cpp +++ b/FrameworkSensors/Device.cpp @@ -479,6 +479,13 @@ OnD0Exit( goto Exit; } + // Close EC handle before sleep to avoid stale handles after wake. + // The handle will be re-acquired in OnTimerExpire when the device wakes. + if (pDevice->m_CrosEcHandle != INVALID_HANDLE_VALUE) { + CloseHandle(pDevice->m_CrosEcHandle); + pDevice->m_CrosEcHandle = INVALID_HANDLE_VALUE; + } + pDevice->m_PoweredOn = FALSE; InitPropVariantFromUInt32(SensorState_Idle, &(pDevice->m_pProperties->List[SENSOR_COMMON_PROPERTY_STATE].Value)); From 5f8022e7258e40e2db6496d09d84e68e95417e55 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Sun, 18 Jan 2026 04:20:20 +0800 Subject: [PATCH 7/8] AccelerometerClient: Re-initialize sensor indices after late EC connection If the EC driver wasn't available during Initialize(), the sensor indices would still be the default values (lid=0, base=1) and never be updated. This would cause the driver to read from the wrong sensor. Add a flag to keep track of whether the indeces were checked already and initialize them if they weren't when reading sensor data. Signed-off-by: Daniel Schaefer --- FrameworkSensors/AccelerometerClient.cpp | 21 ++++++++++++++++++++- FrameworkSensors/Clients.h | 1 + 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/FrameworkSensors/AccelerometerClient.cpp b/FrameworkSensors/AccelerometerClient.cpp index d0efd40..44c4eab 100644 --- a/FrameworkSensors/AccelerometerClient.cpp +++ b/FrameworkSensors/AccelerometerClient.cpp @@ -170,6 +170,7 @@ AccelerometerDevice::Initialize( // Sensible defaults - applies to most devices m_LidSensorIndex = 0; m_BaseSensor = 1; + m_SensorIndicesInitialized = FALSE; Context->m_CrosEcHandle = INVALID_HANDLE_VALUE; // Make sure we have a handle to the EC driver @@ -196,6 +197,7 @@ AccelerometerDevice::Initialize( Status = STATUS_NOT_FOUND; goto Exit; } + m_SensorIndicesInitialized = TRUE; } // @@ -534,7 +536,24 @@ AccelerometerDevice::GetData( return STATUS_INVALID_HANDLE; } - // TODO: Might want to check if sensor indeces are initialized + // Initialize sensor indices if not done during Initialize() (EC wasn't available then) + if (!m_SensorIndicesInitialized) { + UINT8 SensorCount = 0; + Status = CrosEcGetMotionSensorCount(Handle, &SensorCount); + if (NT_SUCCESS(Status) && SensorCount > 0) { + Status = CrosEcGetAccelIndeces(Handle, &m_LidSensorIndex, &m_BaseSensor, SensorCount); + if (NT_SUCCESS(Status)) { + m_SensorIndicesInitialized = TRUE; + TraceInformation("%!FUNC! Late-initialized sensor indices: Lid=%d, Base=%d", m_LidSensorIndex, m_BaseSensor); + } else { + TraceError("%!FUNC! Failed to get accelerometer indices: %!STATUS!", Status); + return Status; + } + } else { + TraceError("%!FUNC! Failed to get sensor count or no sensors available"); + return STATUS_DEVICE_NOT_READY; + } + } UINT8 acc_status = 0; CrosEcReadMemU8(Handle, EC_MEMMAP_ACC_STATUS, &acc_status); diff --git a/FrameworkSensors/Clients.h b/FrameworkSensors/Clients.h index d8f15c2..1965fdb 100644 --- a/FrameworkSensors/Clients.h +++ b/FrameworkSensors/Clients.h @@ -223,6 +223,7 @@ typedef class _AccelerometerDevice : public _ComboDevice AccelerometerSample m_LastSample; UINT8 m_LidSensorIndex; UINT8 m_BaseSensor; + BOOLEAN m_SensorIndicesInitialized; public: From 422ee0be3316ce343b8fed7b17025ad45b1e6977 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Sun, 18 Jan 2026 04:20:27 +0800 Subject: [PATCH 8/8] EcCommunication: DeviceIoControl return BOOL not NTSTATUS Check the boolean return directly and use GetLastError() on failure for proper error reporting. Signed-off-by: Daniel Schaefer --- FrameworkSensors/EcCommunication.cpp | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/FrameworkSensors/EcCommunication.cpp b/FrameworkSensors/EcCommunication.cpp index e797797..aebcbdb 100644 --- a/FrameworkSensors/EcCommunication.cpp +++ b/FrameworkSensors/EcCommunication.cpp @@ -60,12 +60,10 @@ int CrosEcSendCommand( unsigned int inlen ) { - NTSTATUS Status = STATUS_SUCCESS; DWORD retb{}; CROSEC_COMMAND cmd{}; if (Handle == INVALID_HANDLE_VALUE) { - Status = STATUS_INVALID_HANDLE; TraceError("%!FUNC! Invalid Handle"); return 0; } @@ -91,16 +89,16 @@ int CrosEcSendCommand( RtlCopyMemory(cmd.data, outdata, outlen); - Status = DeviceIoControl(Handle, + if (!DeviceIoControl(Handle, (DWORD) IOCTL_CROSEC_XCMD, &cmd, sizeof(cmd), &cmd, sizeof(cmd), &retb, - nullptr); - if (!NT_SUCCESS(Status)) { - TraceError("%!FUNC! ConnectToEc failed %!STATUS!", Status); + nullptr)) { + DWORD err = GetLastError(); + TraceError("%!FUNC! DeviceIoControl XCMD failed, error=%d", err); return 0; } @@ -123,28 +121,26 @@ int CrosEcSendCommand( int CrosEcReadMemU8(HANDLE Handle, unsigned int offset, UINT8* dest) { - NTSTATUS Status = STATUS_SUCCESS; DWORD retb{}; CROSEC_READMEM rm{}; if (Handle == INVALID_HANDLE_VALUE) { - Status = STATUS_INVALID_HANDLE; TraceError("%!FUNC! Invalid Handle"); return 0; } rm.bytes = 0x01; rm.offset = offset; - Status = DeviceIoControl(Handle, + if (!DeviceIoControl(Handle, (DWORD) IOCTL_CROSEC_RDMEM, &rm, sizeof(rm), &rm, sizeof(rm), &retb, - nullptr); - if (!NT_SUCCESS(Status)) { - TraceError("%!FUNC! ConnectToEc failed %!STATUS!", Status); + nullptr)) { + DWORD err = GetLastError(); + TraceError("%!FUNC! DeviceIoControl RDMEM failed, error=%d", err); return 0; }