Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410/* * PROJECT: ReactOS Generic CPU Driver * LICENSE: GNU GPLv2 only as published by the Free Software Foundation * FILE: drivers/processor/processr/pnp.c * PURPOSE: Plug N Play routines * PROGRAMMERS: Eric Kohl <eric.kohl@reactos.org> */
/* INCLUDES *******************************************************************/
#include "processr.h"
#include <stdio.h>#define NDEBUG#include <debug.h>
/* FUNCTIONS ******************************************************************/
staticNTSTATUSGetDeviceId( PDEVICE_OBJECT DeviceObject, BUS_QUERY_ID_TYPE IdType, PWSTR *DeviceId){ PIO_STACK_LOCATION IrpStack; IO_STATUS_BLOCK IoStatus; PDEVICE_OBJECT TargetObject; KEVENT Event; PIRP Irp; NTSTATUS Status;
PAGED_CODE();
/* Initialize the event */ KeInitializeEvent(&Event, NotificationEvent, FALSE);
TargetObject = IoGetAttachedDeviceReference(DeviceObject);
/* Build the IRP */ Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP, TargetObject, NULL, 0, NULL, &Event, &IoStatus); if (Irp == NULL) { Status = STATUS_INSUFFICIENT_RESOURCES; goto done; }
/* PNP IRPs all begin life as STATUS_NOT_SUPPORTED */ Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
/* Get the top of stack */ IrpStack = IoGetNextIrpStackLocation(Irp);
/* Set the top of stack */ RtlZeroMemory(IrpStack, sizeof(IO_STACK_LOCATION)); IrpStack->MajorFunction = IRP_MJ_PNP; IrpStack->MinorFunction = IRP_MN_QUERY_ID; IrpStack->Parameters.QueryId.IdType = IdType;
/* Call the driver */ Status = IoCallDriver(TargetObject, Irp); if (Status == STATUS_PENDING) { KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
Status = IoStatus.Status; }
if (NT_SUCCESS(Status)) { *DeviceId = (PWSTR)IoStatus.Information; }
done: /* Dereference the target device object */ ObDereferenceObject(TargetObject);
return Status;}
staticVOIDProcessorSetFriendlyName( PDEVICE_OBJECT DeviceObject){ KEY_VALUE_PARTIAL_INFORMATION *Buffer = NULL; OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING HardwareKeyName, ValueName, EnumKeyName; HANDLE KeyHandle = NULL; ULONG DataLength = 0; ULONG BufferLength = 0; NTSTATUS Status; PWSTR KeyNameBuffer = NULL; PWSTR DeviceId = NULL; PWSTR InstanceId = NULL; PWSTR pszPrefix = L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum";
RtlInitUnicodeString(&HardwareKeyName, L"\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"); InitializeObjectAttributes(&ObjectAttributes, &HardwareKeyName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); Status = ZwOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes); if (!NT_SUCCESS(Status)) { DPRINT1("ZwOpenKey() failed (Status 0x%08lx)\n", Status); return; }
RtlInitUnicodeString(&ValueName, L"ProcessorNameString"); Status = ZwQueryValueKey(KeyHandle, &ValueName, KeyValuePartialInformation, NULL, 0, &DataLength); if (Status != STATUS_BUFFER_OVERFLOW && Status != STATUS_BUFFER_TOO_SMALL && Status != STATUS_SUCCESS) { DPRINT1("ZwQueryValueKey() failed (Status 0x%08lx)\n", Status); goto done; }
Buffer = ExAllocatePool(PagedPool, DataLength + sizeof(KEY_VALUE_PARTIAL_INFORMATION)); if (Buffer == NULL) { DPRINT1("ExAllocatePool() failed\n"); goto done; }
Status = ZwQueryValueKey(KeyHandle, &ValueName, KeyValuePartialInformation, Buffer, DataLength + sizeof(KEY_VALUE_PARTIAL_INFORMATION), &DataLength); if (!NT_SUCCESS(Status)) { DPRINT1("ZwQueryValueKey() failed (Status 0x%08lx)\n", Status); goto done; }
DPRINT("ProcessorNameString: %S\n", (PWSTR)&Buffer->Data[0]);
ZwClose(KeyHandle); KeyHandle = NULL;
Status = GetDeviceId(DeviceObject, BusQueryDeviceID, &DeviceId); if (!NT_SUCCESS(Status)) { DPRINT1("GetDeviceId() failed (Status 0x%08lx)\n", Status); goto done; }
DPRINT("DeviceId: %S\n", DeviceId);
Status = GetDeviceId(DeviceObject, BusQueryInstanceID, &InstanceId); if (!NT_SUCCESS(Status)) { DPRINT1("GetDeviceId() failed (Status 0x%08lx)\n", Status); goto done; }
DPRINT("InstanceId: %S\n", InstanceId);
BufferLength = wcslen(pszPrefix) + 1 + wcslen(DeviceId) + 1 + wcslen(InstanceId) + 1;
KeyNameBuffer = ExAllocatePool(PagedPool, BufferLength * sizeof(WCHAR)); if (KeyNameBuffer == NULL) { DPRINT1("ExAllocatePool() failed\n"); goto done; }
swprintf(KeyNameBuffer, L"%s\\%s\\%s", pszPrefix, DeviceId, InstanceId);
RtlInitUnicodeString(&EnumKeyName, KeyNameBuffer); InitializeObjectAttributes(&ObjectAttributes, &EnumKeyName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); Status = ZwOpenKey(&KeyHandle, KEY_WRITE, &ObjectAttributes); if (!NT_SUCCESS(Status)) { DPRINT1("ZwOpenKey() failed (Status 0x%08lx)\n", Status); goto done; }
RtlInitUnicodeString(&ValueName, L"FriendlyName"); Status = ZwSetValueKey(KeyHandle, &ValueName, 0, REG_SZ, (PVOID)&Buffer->Data[0], Buffer->DataLength); if (!NT_SUCCESS(Status)) { DPRINT1("ZwSetValueKey() failed (Status 0x%08lx)\n", Status); goto done; }
done: if (KeyHandle != NULL) ZwClose(KeyHandle);
if (KeyNameBuffer != NULL) ExFreePool(KeyNameBuffer);
if (InstanceId != NULL) ExFreePool(InstanceId);
if (DeviceId != NULL) ExFreePool(DeviceId);
if (Buffer != NULL) ExFreePool(Buffer);}
staticNTSTATUSProcessorStartDevice( IN PDEVICE_OBJECT DeviceObject, IN PCM_RESOURCE_LIST ResourceList, IN PCM_RESOURCE_LIST ResourceListTranslated){ DPRINT("ProcessorStartDevice()\n");
ProcessorSetFriendlyName(DeviceObject);
return STATUS_SUCCESS;}
NTSTATUSNTAPIProcessorPnp( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){ PDEVICE_EXTENSION DeviceExtension; PIO_STACK_LOCATION IrpSp; ULONG_PTR Information = 0; NTSTATUS Status = STATUS_NOT_SUPPORTED;
DPRINT("ProcessorPnp()\n");
IrpSp = IoGetCurrentIrpStackLocation(Irp);
switch (IrpSp->MinorFunction) { case IRP_MN_START_DEVICE: DPRINT(" IRP_MN_START_DEVICE received\n");
/* Call lower driver */ DeviceExtension = DeviceObject->DeviceExtension; Status = STATUS_UNSUCCESSFUL;
if (IoForwardIrpSynchronously(DeviceExtension->LowerDevice, Irp)) { Status = Irp->IoStatus.Status; if (NT_SUCCESS(Status)) { Status = ProcessorStartDevice(DeviceObject, IrpSp->Parameters.StartDevice.AllocatedResources, IrpSp->Parameters.StartDevice.AllocatedResourcesTranslated); } } break;
case IRP_MN_QUERY_REMOVE_DEVICE: DPRINT(" IRP_MN_QUERY_REMOVE_DEVICE\n"); return ForwardIrpAndForget(DeviceObject, Irp);
case IRP_MN_REMOVE_DEVICE: DPRINT(" IRP_MN_REMOVE_DEVICE received\n"); return ForwardIrpAndForget(DeviceObject, Irp);
case IRP_MN_CANCEL_REMOVE_DEVICE: DPRINT(" IRP_MN_CANCEL_REMOVE_DEVICE\n"); return ForwardIrpAndForget(DeviceObject, Irp);
case IRP_MN_STOP_DEVICE: DPRINT(" IRP_MN_STOP_DEVICE received\n"); return ForwardIrpAndForget(DeviceObject, Irp);
case IRP_MN_QUERY_STOP_DEVICE: DPRINT(" IRP_MN_QUERY_STOP_DEVICE received\n"); return ForwardIrpAndForget(DeviceObject, Irp);
case IRP_MN_CANCEL_STOP_DEVICE: DPRINT(" IRP_MN_CANCEL_STOP_DEVICE\n"); return ForwardIrpAndForget(DeviceObject, Irp);
case IRP_MN_QUERY_DEVICE_RELATIONS: DPRINT(" IRP_MN_QUERY_DEVICE_RELATIONS\n");
switch (IrpSp->Parameters.QueryDeviceRelations.Type) { case BusRelations: DPRINT(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations\n"); return ForwardIrpAndForget(DeviceObject, Irp); break;
case RemovalRelations: DPRINT(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / RemovalRelations\n"); return ForwardIrpAndForget(DeviceObject, Irp);
default: DPRINT(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown type 0x%lx\n", IrpSp->Parameters.QueryDeviceRelations.Type); return ForwardIrpAndForget(DeviceObject, Irp); } break;
case IRP_MN_SURPRISE_REMOVAL: DPRINT(" IRP_MN_SURPRISE_REMOVAL received\n"); return ForwardIrpAndForget(DeviceObject, Irp);
case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: /* (optional) 0xd */ DPRINT(" IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); return ForwardIrpAndForget(DeviceObject, Irp);
default: DPRINT(" Unknown IOCTL 0x%lx\n", IrpSp->MinorFunction); return ForwardIrpAndForget(DeviceObject, Irp); }
Irp->IoStatus.Information = Information; Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;}
NTSTATUSNTAPIProcessorAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT Pdo){ PDEVICE_EXTENSION DeviceExtension = NULL; PDEVICE_OBJECT Fdo = NULL; NTSTATUS Status;
DPRINT("ProcessorAddDevice()\n");
ASSERT(DriverObject); ASSERT(Pdo);
/* Create functional device object */ Status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), NULL, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &Fdo); if (NT_SUCCESS(Status)) { DeviceExtension = (PDEVICE_EXTENSION)Fdo->DeviceExtension; RtlZeroMemory(DeviceExtension, sizeof(DEVICE_EXTENSION));
DeviceExtension->DeviceObject = Fdo;
Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo, &DeviceExtension->LowerDevice); if (!NT_SUCCESS(Status)) { DPRINT1("IoAttachDeviceToDeviceStackSafe() failed with status 0x%08lx\n", Status); IoDeleteDevice(Fdo); return Status; }
Fdo->Flags |= DO_DIRECT_IO; Fdo->Flags |= DO_POWER_PAGABLE;
Fdo->Flags &= ~DO_DEVICE_INITIALIZING; }
return Status;}
/* EOF */