2 * PROJECT: ReactOS Generic CPU Driver
3 * LICENSE: GNU GPLv2 only as published by the Free Software Foundation
4 * FILE: drivers/processor/processr/pnp.c
5 * PURPOSE: Plug N Play routines
6 * PROGRAMMERS: Eric Kohl <eric.kohl@reactos.org>
9 /* INCLUDES *******************************************************************/
17 /* FUNCTIONS ******************************************************************/
22 PDEVICE_OBJECT DeviceObject
,
23 BUS_QUERY_ID_TYPE IdType
,
26 PIO_STACK_LOCATION IrpStack
;
27 IO_STATUS_BLOCK IoStatus
;
28 PDEVICE_OBJECT TargetObject
;
35 /* Initialize the event */
36 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
38 TargetObject
= IoGetAttachedDeviceReference(DeviceObject
);
41 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_PNP
,
50 Status
= STATUS_INSUFFICIENT_RESOURCES
;
54 /* PNP IRPs all begin life as STATUS_NOT_SUPPORTED */
55 Irp
->IoStatus
.Status
= STATUS_NOT_SUPPORTED
;
57 /* Get the top of stack */
58 IrpStack
= IoGetNextIrpStackLocation(Irp
);
60 /* Set the top of stack */
61 RtlZeroMemory(IrpStack
, sizeof(IO_STACK_LOCATION
));
62 IrpStack
->MajorFunction
= IRP_MJ_PNP
;
63 IrpStack
->MinorFunction
= IRP_MN_QUERY_ID
;
64 IrpStack
->Parameters
.QueryId
.IdType
= IdType
;
67 Status
= IoCallDriver(TargetObject
, Irp
);
68 if (Status
== STATUS_PENDING
)
70 KeWaitForSingleObject(&Event
,
76 Status
= IoStatus
.Status
;
79 if (NT_SUCCESS(Status
))
81 *DeviceId
= (PWSTR
)IoStatus
.Information
;
85 /* Dereference the target device object */
86 ObDereferenceObject(TargetObject
);
95 ProcessorSetFriendlyName(
96 PDEVICE_OBJECT DeviceObject
)
98 KEY_VALUE_PARTIAL_INFORMATION
*Buffer
= NULL
;
99 OBJECT_ATTRIBUTES ObjectAttributes
;
100 UNICODE_STRING HardwareKeyName
, ValueName
, EnumKeyName
;
101 HANDLE KeyHandle
= NULL
;
102 ULONG DataLength
= 0;
103 ULONG BufferLength
= 0;
105 PWSTR KeyNameBuffer
= NULL
;
106 PWSTR DeviceId
= NULL
;
107 PWSTR InstanceId
= NULL
;
108 PWSTR pszPrefix
= L
"\\Registry\\Machine\\System\\CurrentcontrolSet\\Enum";
110 RtlInitUnicodeString(&HardwareKeyName
,
111 L
"\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");
112 InitializeObjectAttributes(&ObjectAttributes
,
114 OBJ_CASE_INSENSITIVE
| OBJ_KERNEL_HANDLE
,
117 Status
= ZwOpenKey(&KeyHandle
,
120 if (!NT_SUCCESS(Status
))
122 DPRINT1("ZwOpenKey() failed (Status 0x%08lx)\n", Status
);
126 RtlInitUnicodeString(&ValueName
,
127 L
"ProcessorNameString");
128 Status
= ZwQueryValueKey(KeyHandle
,
130 KeyValuePartialInformation
,
134 if (Status
!= STATUS_BUFFER_OVERFLOW
&& Status
!= STATUS_BUFFER_TOO_SMALL
&& Status
!= STATUS_SUCCESS
)
136 DPRINT1("ZwQueryValueKey() failed (Status 0x%08lx)\n", Status
);
140 Buffer
= ExAllocatePool(PagedPool
,
141 DataLength
+ sizeof(KEY_VALUE_PARTIAL_INFORMATION
));
144 DPRINT1("ExAllocatePool() failed\n");
148 Status
= ZwQueryValueKey(KeyHandle
,
150 KeyValuePartialInformation
,
152 DataLength
+ sizeof(KEY_VALUE_PARTIAL_INFORMATION
),
154 if (!NT_SUCCESS(Status
))
156 DPRINT1("ZwQueryValueKey() failed (Status 0x%08lx)\n", Status
);
160 DPRINT("ProcessorNameString: %S\n", (PWSTR
)&Buffer
->Data
[0]);
165 Status
= GetDeviceId(DeviceObject
,
168 if (!NT_SUCCESS(Status
))
170 DPRINT1("GetDeviceId() failed (Status 0x%08lx)\n", Status
);
174 DPRINT("DeviceId: %S\n", DeviceId
);
176 Status
= GetDeviceId(DeviceObject
,
179 if (!NT_SUCCESS(Status
))
181 DPRINT1("GetDeviceId() failed (Status 0x%08lx)\n", Status
);
185 DPRINT("InstanceId: %S\n", InstanceId
);
187 BufferLength
= wcslen(pszPrefix
) + 1 + wcslen(DeviceId
) + 1 + wcslen(InstanceId
) + 1;
189 KeyNameBuffer
= ExAllocatePool(PagedPool
, BufferLength
* sizeof(WCHAR
));
190 if (KeyNameBuffer
== NULL
)
192 DPRINT1("ExAllocatePool() failed\n");
196 swprintf(KeyNameBuffer
, L
"%s\\%s\\%s", pszPrefix
, DeviceId
, InstanceId
);
198 RtlInitUnicodeString(&EnumKeyName
, KeyNameBuffer
);
199 InitializeObjectAttributes(&ObjectAttributes
,
201 OBJ_CASE_INSENSITIVE
| OBJ_KERNEL_HANDLE
,
204 Status
= ZwOpenKey(&KeyHandle
,
207 if (!NT_SUCCESS(Status
))
209 DPRINT1("ZwOpenKey() failed (Status 0x%08lx)\n", Status
);
213 RtlInitUnicodeString(&ValueName
,
215 Status
= ZwSetValueKey(KeyHandle
,
219 (PVOID
)&Buffer
->Data
[0],
221 if (!NT_SUCCESS(Status
))
223 DPRINT1("ZwSetValueKey() failed (Status 0x%08lx)\n", Status
);
228 if (KeyHandle
!= NULL
)
231 if (KeyNameBuffer
!= NULL
)
232 ExFreePool(KeyNameBuffer
);
234 if (InstanceId
!= NULL
)
235 ExFreePool(InstanceId
);
237 if (DeviceId
!= NULL
)
238 ExFreePool(DeviceId
);
247 ProcessorStartDevice(
248 IN PDEVICE_OBJECT DeviceObject
,
249 IN PCM_RESOURCE_LIST ResourceList
,
250 IN PCM_RESOURCE_LIST ResourceListTranslated
)
252 DPRINT("ProcessorStartDevice()\n");
254 ProcessorSetFriendlyName(DeviceObject
);
256 return STATUS_SUCCESS
;
263 IN PDEVICE_OBJECT DeviceObject
,
266 PIO_STACK_LOCATION IrpSp
;
267 ULONG_PTR Information
= 0;
268 NTSTATUS Status
= STATUS_NOT_SUPPORTED
;
270 DPRINT("ProcessorPnp()\n");
272 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
274 switch (IrpSp
->MinorFunction
)
276 case IRP_MN_START_DEVICE
:
277 DPRINT(" IRP_MN_START_DEVICE received\n");
279 /* Call lower driver */
280 Status
= ForwardIrpAndWait(DeviceObject
, Irp
);
281 if (NT_SUCCESS(Status
))
283 Status
= ProcessorStartDevice(DeviceObject
,
284 IrpSp
->Parameters
.StartDevice
.AllocatedResources
,
285 IrpSp
->Parameters
.StartDevice
.AllocatedResourcesTranslated
);
289 case IRP_MN_QUERY_REMOVE_DEVICE
:
290 DPRINT(" IRP_MN_QUERY_REMOVE_DEVICE\n");
291 return ForwardIrpAndForget(DeviceObject
, Irp
);
293 case IRP_MN_REMOVE_DEVICE
:
294 DPRINT(" IRP_MN_REMOVE_DEVICE received\n");
295 return ForwardIrpAndForget(DeviceObject
, Irp
);
297 case IRP_MN_CANCEL_REMOVE_DEVICE
:
298 DPRINT(" IRP_MN_CANCEL_REMOVE_DEVICE\n");
299 return ForwardIrpAndForget(DeviceObject
, Irp
);
301 case IRP_MN_STOP_DEVICE
:
302 DPRINT(" IRP_MN_STOP_DEVICE received\n");
303 return ForwardIrpAndForget(DeviceObject
, Irp
);
305 case IRP_MN_QUERY_STOP_DEVICE
:
306 DPRINT(" IRP_MN_QUERY_STOP_DEVICE received\n");
307 return ForwardIrpAndForget(DeviceObject
, Irp
);
309 case IRP_MN_CANCEL_STOP_DEVICE
:
310 DPRINT(" IRP_MN_CANCEL_STOP_DEVICE\n");
311 return ForwardIrpAndForget(DeviceObject
, Irp
);
313 case IRP_MN_QUERY_DEVICE_RELATIONS
:
314 DPRINT(" IRP_MN_QUERY_DEVICE_RELATIONS\n");
316 switch (IrpSp
->Parameters
.QueryDeviceRelations
.Type
)
319 DPRINT(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations\n");
320 return ForwardIrpAndForget(DeviceObject
, Irp
);
323 case RemovalRelations
:
324 DPRINT(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / RemovalRelations\n");
325 return ForwardIrpAndForget(DeviceObject
, Irp
);
328 DPRINT(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown type 0x%lx\n",
329 IrpSp
->Parameters
.QueryDeviceRelations
.Type
);
330 return ForwardIrpAndForget(DeviceObject
, Irp
);
334 case IRP_MN_SURPRISE_REMOVAL
:
335 DPRINT(" IRP_MN_SURPRISE_REMOVAL received\n");
336 return ForwardIrpAndForget(DeviceObject
, Irp
);
338 case IRP_MN_FILTER_RESOURCE_REQUIREMENTS
: /* (optional) 0xd */
339 DPRINT(" IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
340 return ForwardIrpAndForget(DeviceObject
, Irp
);
343 DPRINT(" Unknown IOCTL 0x%lx\n", IrpSp
->MinorFunction
);
344 return ForwardIrpAndForget(DeviceObject
, Irp
);
347 Irp
->IoStatus
.Information
= Information
;
348 Irp
->IoStatus
.Status
= Status
;
349 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
358 IN PDRIVER_OBJECT DriverObject
,
359 IN PDEVICE_OBJECT Pdo
)
361 PDEVICE_EXTENSION DeviceExtension
= NULL
;
362 PDEVICE_OBJECT Fdo
= NULL
;
365 DPRINT("ProcessorAddDevice()\n");
367 ASSERT(DriverObject
);
370 /* Create functional device object */
371 Status
= IoCreateDevice(DriverObject
,
372 sizeof(DEVICE_EXTENSION
),
375 FILE_DEVICE_SECURE_OPEN
,
378 if (NT_SUCCESS(Status
))
380 DeviceExtension
= (PDEVICE_EXTENSION
)Fdo
->DeviceExtension
;
381 RtlZeroMemory(DeviceExtension
, sizeof(DEVICE_EXTENSION
));
383 DeviceExtension
->DeviceObject
= Fdo
;
385 Status
= IoAttachDeviceToDeviceStackSafe(Fdo
, Pdo
, &DeviceExtension
->LowerDevice
);
386 if (!NT_SUCCESS(Status
))
388 DPRINT1("IoAttachDeviceToDeviceStackSafe() failed with status 0x%08lx\n", Status
);
393 Fdo
->Flags
|= DO_DIRECT_IO
;
394 Fdo
->Flags
|= DO_POWER_PAGABLE
;
396 Fdo
->Flags
&= ~DO_DEVICE_INITIALIZING
;