52 DPRINT1(
"NtPlugPlayControl() failed with status 0x%08x\n",
Status);
71 PWSTR keyboardClass =
L"kbdclass\0";
72 PWSTR partMgr =
L"partmgr\0";
114 DPRINT1(
"Using driver '%S' for device '%S'\n", ImagePath, DeviceId);
122 DPRINT1(
"NtCreateKey('%wZ') failed with status 0x%08x\n", &StringU,
Status);
161 if (ClassGuid &&
_wcsicmp(ClassGuid,
L"{4D36E96B-E325-11CE-BFC1-08002BE10318}") == 0)
163 DPRINT1(
"Installing keyboard class driver for '%S'\n", DeviceId);
171 else if (ClassGuid &&
_wcsicmp(ClassGuid,
L"{4D36E967-E325-11CE-BFC1-08002BE10318}") == 0)
173 DPRINT1(
"Installing partition manager driver for '%S'\n", DeviceId);
199 return deviceInstalled;
226 DPRINT(
"Unable to open subkey '%S'\n", DeviceId);
240 if (!pPartialInformation)
242 DPRINT1(
"RtlAllocateHeap() failed\n");
260 DPRINT1(
"NtQueryValueKey() failed with status 0x%08x\n",
Status);
261 if (pPartialInformation)
266 else if (pPartialInformation)
271 && !bDriverInstalled;
278 if (!bDriverInstalled)
280 if (pPartialInformation)
283 pPartialInformation =
NULL;
295 if (!pPartialInformation)
297 DPRINT(
"RtlAllocateHeap() failed\n");
315 if (pPartialInformation)
318 DPRINT1(
"NtQueryValueKey() failed with status 0x%08x\n",
Status);
321 else if (pPartialInformation)
326 && !bDriverInstalled;
333 if (!bDriverInstalled)
334 DPRINT(
"No driver available for %S\n", DeviceId);
357 if (ListEntry ==
NULL)
397 PnpEventSize = 0x1000;
399 if (PnpEvent ==
NULL)
407 DPRINT(
"Calling NtGetPlugPlayEvent()\n");
415 PnpEventSize += 0x400;
417 if (NewPnpEvent ==
NULL)
422 PnpEvent = NewPnpEvent;
428 DPRINT1(
"NtGetPlugPlayEvent() failed (Status 0x%08lx)\n",
Status);
433 DPRINT(
"Received PnP Event\n");
438 ULONG DeviceIdLength;
461 DPRINT1(
"Not enough memory (size %lu)\n",
len);
467 DPRINT(
"Unknown event, GUID {%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}\n",
477 sizeof(ResponseData));
480 DPRINT1(
"NtPlugPlayControl(PlugPlayControlUserResponse) failed (Status 0x%08lx)\n",
Status);
530 DPRINT1(
"WaitNoPendingInstallEvents() failed to wait!\n");
557 DPRINT1(
"Could not create the Pending-Install Event! (Status 0x%08lx)\n",
Status);
572 DPRINT1(
"Could not create the List Event! (Status 0x%08lx)\n",
Status);
581 DPRINT1(
"Could not create the List Mutex! (Status 0x%08lx)\n",
Status);
590 DPRINT1(
"NtOpenKey('%wZ') failed (Status 0x%08lx)\n", &EnumU,
Status);
598 DPRINT1(
"NtCreateKey('%wZ') failed (Status 0x%08lx)\n", &ServicesU,
Status);
615 DPRINT1(
"Failed to create the PnP event thread (Status 0x%08lx)\n",
Status);
633 DPRINT1(
"Failed to create the device installation thread (Status 0x%08lx)\n",
Status);
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
NTSTATUS NTAPI NtCreateKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG TitleIndex, IN PUNICODE_STRING Class OPTIONAL, IN ULONG CreateOptions, OUT PULONG Disposition OPTIONAL)
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
#define OBJ_CASE_INSENSITIVE
#define UNREFERENCED_PARAMETER(P)
struct _PLUGPLAY_EVENT_BLOCK::@2361::@2364 TargetDevice
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
#define NtCurrentThread()
NTSTATUS NTAPI NtCreateEvent(OUT PHANDLE EventHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN EVENT_TYPE EventType, IN BOOLEAN InitialState)
pSpInfFindFirstLine SpInfFindFirstLine
#define InsertTailList(ListHead, Entry)
NTSTATUS NTAPI NtSuspendThread(IN HANDLE ThreadHandle, OUT PULONG PreviousSuspendCount OPTIONAL)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Reserved_ ULONG _In_opt_ PUNICODE_STRING _In_ ULONG _Out_opt_ PULONG Disposition
NTSTATUS NTAPI NtResetEvent(IN HANDLE EventHandle, OUT PLONG PreviousState OPTIONAL)
#define STATUS_BUFFER_TOO_SMALL
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define MUTANT_ALL_ACCESS
NTSTATUS NTAPI NtGetPlugPlayEvent(IN ULONG Reserved1, IN ULONG Reserved2, OUT PPLUGPLAY_EVENT_BLOCK Buffer, IN ULONG BufferSize)
static HANDLE hDeviceInstallThread
BOOLEAN INF_GetDataField(IN PINFCONTEXT Context, IN ULONG FieldIndex, OUT PCWSTR *Data)
static ULONG NTAPI DeviceInstallThread(IN PVOID Parameter)
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
NTSTATUS InitializeUserModePnpManager(IN HINF *phSetupInf)
#define REG_CREATED_NEW_KEY
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
#define NtCurrentProcess()
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
static BOOLEAN InstallDriver(IN HINF hInf, IN HANDLE hServices, IN HANDLE hDeviceKey, IN LPCWSTR DeviceId, IN LPCWSTR HardwareId)
#define REG_OPTION_NON_VOLATILE
static HANDLE hServicesKey
NTSYSAPI NTSTATUS NTAPI NtQueryValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, IN PVOID KeyValueInformation, IN ULONG Length, IN PULONG ResultLength)
NTSTATUS NtTerminateThread(IN HANDLE ThreadHandle OPTIONAL, IN NTSTATUS ExitStatus)
NTSTATUS NTAPI NtResumeThread(IN HANDLE ThreadHandle, OUT PULONG SuspendCount OPTIONAL)
NTSTATUS NTAPI NtSetEvent(IN HANDLE EventHandle, OUT PLONG PreviousState OPTIONAL)
static HANDLE hNoPendingInstalls
#define NT_SUCCESS(StatCode)
BOOLEAN EnableUserModePnpManager(VOID)
struct _KEY_VALUE_PARTIAL_INFORMATION * PKEY_VALUE_PARTIAL_INFORMATION
static ULONG NTAPI PnpEventThread(IN PVOID Parameter)
FORCEINLINE VOID INF_FreeData(IN PCWSTR InfData)
NTSTATUS NTAPI NtCreateMutant(OUT PHANDLE MutantHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN BOOLEAN InitialOwner)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
NTSYSAPI NTSTATUS NTAPI RtlCreateUserThread(_In_ PVOID ThreadContext, _Out_ HANDLE *OutThreadHandle, _Reserved_ PVOID Reserved1, _Reserved_ PVOID Reserved2, _Reserved_ PVOID Reserved3, _Reserved_ PVOID Reserved4, _Reserved_ PVOID Reserved5, _Reserved_ PVOID Reserved6, _Reserved_ PVOID Reserved7, _Reserved_ PVOID Reserved8)
static BOOLEAN ResetDevice(IN LPCWSTR DeviceId)
static HANDLE hDeviceInstallListNotEmpty
static LIST_ENTRY DeviceInstallListHead
NTSTATUS NTAPI NtPlugPlayControl(IN PLUGPLAY_CONTROL_CLASS PlugPlayControlClass, IN OUT PVOID Buffer, IN ULONG BufferLength)
UNICODE_STRING DeviceInstance
#define STATUS_OBJECT_NAME_NOT_FOUND
NTSTATUS WaitNoPendingInstallEvents(IN PLARGE_INTEGER Timeout OPTIONAL)
static VOID InstallDevice(IN HINF hInf, IN HANDLE hEnum, IN HANDLE hServices, IN LPCWSTR DeviceId)
#define InitializeListHead(ListHead)
#define FIELD_OFFSET(t, f)
VOID TerminateUserModePnpManager(VOID)
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
NTSYSAPI NTSTATUS NTAPI NtSetValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN ULONG TitleIndex OPTIONAL, IN ULONG Type, IN PVOID Data, IN ULONG DataSize)
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ PCUNICODE_STRING HardwareID
NTSYSAPI NTSTATUS NTAPI NtOpenKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
struct tagContext Context
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI PVOID WINAPI RtlReAllocateHeap(HANDLE, ULONG, PVOID, SIZE_T)
#define InitializeObjectAttributes(p, n, a, r, s)
BOOLEAN DisableUserModePnpManager(VOID)
_Must_inspect_result_ _In_ WDFDRIVER Driver
NTSTATUS NTAPI NtReleaseMutant(IN HANDLE MutantHandle, IN PLONG PreviousCount OPTIONAL)
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
static HANDLE hDeviceInstallListMutex
#define RTL_CONSTANT_STRING(s)
#define SERVICE_KERNEL_DRIVER
PULONG MinorVersion OPTIONAL
NTSYSAPI NTSTATUS NTAPI NtWaitForSingleObject(IN HANDLE hObject, IN BOOLEAN bAlertable, IN PLARGE_INTEGER Timeout)