@@ -64,6 +64,38 @@ void AllocateDeviceAtIndex(
6464 }
6565}
6666
67+ NTSTATUS ConnectToEc (
68+ _In_ WDFDEVICE FxDevice,
69+ _Inout_ HANDLE *Handle
70+ ) {
71+ SENSOR_FunctionEnter ();
72+ NTSTATUS Status = STATUS_SUCCESS;
73+
74+ UNREFERENCED_PARAMETER (FxDevice);
75+
76+ *Handle = CreateFileW (
77+ LR"( \\.\GLOBALROOT\Device\CrosEC)" ,
78+ GENERIC_READ | GENERIC_WRITE,
79+ FILE_SHARE_READ | FILE_SHARE_WRITE,
80+ NULL ,
81+ OPEN_EXISTING,
82+ FILE_FLAG_OVERLAPPED,
83+ NULL );
84+
85+ if (*Handle == INVALID_HANDLE_VALUE) {
86+ Status = STATUS_INVALID_HANDLE;
87+ TraceError (" COMBO %!FUNC! CreateFileW failed %!STATUS!" , Status);
88+ goto Exit;
89+ }
90+
91+ Exit:
92+ SENSOR_FunctionExit (Status);
93+
94+ return Status;
95+ }
96+
97+
98+
6799// ------------------------------------------------------------------------------
68100//
69101// Function: OnDeviceAdd
@@ -199,9 +231,43 @@ OnPrepareHardware(
199231 )
200232{
201233 NTSTATUS Status = STATUS_SUCCESS;
234+ ULONG i;
235+ HANDLE Handle;
236+ DWORD retb{};
237+ CROSEC_READMEM rm{};
202238
203239 SENSOR_FunctionEnter ();
204240
241+ Status = ConnectToEc (Device, &Handle);
242+ if (!NT_SUCCESS (Status)) {
243+ TraceError (" COMBO %!FUNC! ConnectToEc failed %!STATUS!" , Status);
244+ goto Exit;
245+ }
246+
247+ rm.bytes = 0xfe ;
248+ rm.offset = 0 ;
249+ Status = DeviceIoControl (Handle,
250+ (DWORD) IOCTL_CROSEC_RDMEM,
251+ &rm,
252+ sizeof (rm),
253+ &rm,
254+ sizeof (rm),
255+ &retb,
256+ nullptr );
257+ if (!NT_SUCCESS (Status)) {
258+ TraceError (" COMBO %!FUNC! ConnectToEc failed %!STATUS!" , Status);
259+ goto Exit;
260+ }
261+
262+ UINT8 *EcMem = rm.buffer ;
263+ for (i = 0 ; i < 0xfe -16 ; i+=16 ) {
264+ TraceInformation (
265+ " %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n " ,
266+ EcMem[i], EcMem[i+1 ], EcMem[i+2 ], EcMem[i+3 ], EcMem[i+4 ], EcMem[i + 5 ], EcMem[i + 6 ], EcMem[i + 7 ],
267+ EcMem[i + 8 ], EcMem[i+9 ], EcMem[i+10 ], EcMem[i+11 ], EcMem[i+12 ], EcMem[i + 13 ], EcMem[i + 14 ], EcMem[i + 15 ]
268+ );
269+ }
270+
205271 for (ULONG Count = 0 ; Count < SensorInstanceCount; Count++)
206272 {
207273 PComboDevice pDevice = nullptr ;
@@ -231,6 +297,8 @@ OnPrepareHardware(
231297
232298 AllocateDeviceAtIndex (Count, &pDevice);
233299
300+ pDevice->m_CrosEcHandle = Handle;
301+
234302 // Fill out properties
235303 Status = pDevice->Initialize (Device, SensorInstance);
236304 if (!NT_SUCCESS (Status))
@@ -331,80 +399,6 @@ OnReleaseHardware(
331399 return Status;
332400}
333401
334- #define FILE_DEVICE_CROS_EMBEDDED_CONTROLLER 0x80EC
335-
336- #define IOCTL_CROSEC_XCMD \
337- CTL_CODE (FILE_DEVICE_CROS_EMBEDDED_CONTROLLER, 0x801 , METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
338- #define IOCTL_CROSEC_RDMEM CTL_CODE (FILE_DEVICE_CROS_EMBEDDED_CONTROLLER, 0x802 , METHOD_BUFFERED, FILE_READ_DATA)
339-
340- #define CROSEC_CMD_MAX_REQUEST 0x100
341- #define CROSEC_CMD_MAX_RESPONSE 0x100
342- #define CROSEC_MEMMAP_SIZE 0xFF
343-
344- typedef struct _CROSEC_READMEM {
345- ULONG offset;
346- ULONG bytes;
347- UCHAR buffer[CROSEC_MEMMAP_SIZE];
348- } * PCROSEC_READMEM, CROSEC_READMEM;
349-
350-
351- NTSTATUS ConnectToEc (
352- _In_ WDFDEVICE FxDevice
353- ) {
354- SENSOR_FunctionEnter ();
355- NTSTATUS Status = STATUS_SUCCESS;
356- HANDLE h;
357- CROSEC_READMEM rm{};
358- DWORD retb{};
359-
360- UNREFERENCED_PARAMETER (FxDevice);
361-
362- h = CreateFileW (
363- LR"( \\.\GLOBALROOT\Device\CrosEC)" ,
364- GENERIC_READ | GENERIC_WRITE,
365- FILE_SHARE_READ | FILE_SHARE_WRITE,
366- NULL ,
367- OPEN_EXISTING,
368- FILE_FLAG_OVERLAPPED,
369- NULL );
370-
371- if (h == INVALID_HANDLE_VALUE) {
372- Status = STATUS_INVALID_HANDLE;
373- TraceError (" COMBO %!FUNC! CreateFileW failed %!STATUS!" , Status);
374- goto Exit;
375- }
376-
377- rm.bytes = 0xfe ;
378- rm.offset = 0 ;
379- Status = DeviceIoControl (h,
380- (DWORD) IOCTL_CROSEC_RDMEM,
381- &rm,
382- sizeof (rm),
383- &rm,
384- sizeof (rm),
385- &retb,
386- nullptr );
387- if (!NT_SUCCESS (Status)) {
388- TraceError (" COMBO %!FUNC! ConnectToEc failed %!STATUS!" , Status);
389- goto Exit;
390- }
391-
392- UINT8 *EcMem = rm.buffer ;
393- for (int i = 0 ; i < 0xfe -16 ; i+=16 ) {
394- TraceInformation (
395- " %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n " ,
396- EcMem[i], EcMem[i+1 ], EcMem[i+2 ], EcMem[i+3 ], EcMem[i+4 ], EcMem[i + 5 ], EcMem[i + 6 ], EcMem[i + 7 ],
397- EcMem[i + 8 ], EcMem[i+9 ], EcMem[i+10 ], EcMem[i+11 ], EcMem[i+12 ], EcMem[i + 13 ], EcMem[i + 14 ], EcMem[i + 15 ]
398- );
399- }
400-
401- Exit:
402- SENSOR_FunctionExit (Status);
403-
404- return Status;
405- }
406-
407-
408402// ------------------------------------------------------------------------------
409403//
410404// Function: OnD0Entry
@@ -435,11 +429,6 @@ OnD0Entry(
435429
436430 SENSOR_FunctionEnter ();
437431
438- Status = ConnectToEc (Device);
439- if (!NT_SUCCESS (Status)) {
440- TraceError (" COMBO %!FUNC! ConnectToEc failed %!STATUS!" , Status);
441- goto Exit;
442- }
443432
444433 //
445434 // Get sensor instances
0 commit comments