diff --git a/FrameworkSensors/AccelerometerClient.cpp b/FrameworkSensors/AccelerometerClient.cpp
index 8226095..44c4eab 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 *LidSensor, UINT8 *BaseSensor, 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,38 @@ 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;
+ m_BaseSensor = 1;
+ m_SensorIndicesInitialized = FALSE;
+ Context->m_CrosEcHandle = INVALID_HANDLE_VALUE;
+
+ // Make sure we have a handle to the EC driver
+ ConnectToEc(&Context->m_CrosEcHandle);
- SensorCount = CrosEcGetMotionSensorCount(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_BaseSensor, SensorCount);
+ if (!NT_SUCCESS(Status))
+ {
+ TraceError("%!FUNC! Failed to get accelerometer indeces: %!STATUS!", Status);
+ Status = STATUS_NOT_FOUND;
+ goto Exit;
+ }
+ m_SensorIndicesInitialized = TRUE;
}
//
@@ -515,6 +531,30 @@ AccelerometerDevice::GetData(
SENSOR_FunctionEnter();
+ if (Handle == INVALID_HANDLE_VALUE) {
+ TraceError("%!FUNC! Handle is invalid");
+ return STATUS_INVALID_HANDLE;
+ }
+
+ // 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);
TraceInformation("Status: (%02x), Present: %d, Busy: %d\n",
@@ -663,4 +703,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/Clients.h b/FrameworkSensors/Clients.h
index db0780f..1965fdb 100644
--- a/FrameworkSensors/Clients.h
+++ b/FrameworkSensors/Clients.h
@@ -222,7 +222,8 @@ typedef class _AccelerometerDevice : public _ComboDevice
AccelerometerSample m_CachedData;
AccelerometerSample m_LastSample;
UINT8 m_LidSensorIndex;
- UINT8 m_LidBaseSensor;
+ UINT8 m_BaseSensor;
+ BOOLEAN m_SensorIndicesInitialized;
public:
diff --git a/FrameworkSensors/Device.cpp b/FrameworkSensors/Device.cpp
index c946fe0..c5197b0 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);
@@ -513,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));
diff --git a/FrameworkSensors/EcCommunication.cpp b/FrameworkSensors/EcCommunication.cpp
index 00015c3..aebcbdb 100644
--- a/FrameworkSensors/EcCommunication.cpp
+++ b/FrameworkSensors/EcCommunication.cpp
@@ -21,7 +21,16 @@
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_SUCCESS;
+ }
*Handle = CreateFileW(
LR"(\\.\GLOBALROOT\Device\CrosEC)",
@@ -33,11 +42,12 @@ NTSTATUS ConnectToEc(
NULL);
if (*Handle == INVALID_HANDLE_VALUE) {
- TraceError("%!FUNC! CreateFileW failed %!STATUS!", Status);
+ TraceError("%!FUNC! CreateFileW failed");
return STATUS_INVALID_HANDLE;
}
- return Status;
+ TraceInformation("%!FUNC! Got Handle");
+ return STATUS_SUCCESS;
}
int CrosEcSendCommand(
@@ -50,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;
}
@@ -81,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;
}
@@ -113,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;
}
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