PVOID NTAPI
USBD_AllocateDeviceName(ULONG Unknown)
{
+ UNIMPLEMENTED
return NULL;
}
ULONG NTAPI
USBD_Dispatch(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3, ULONG Unknown4)
{
+ UNIMPLEMENTED
return 1;
}
VOID NTAPI
USBD_FreeDeviceMutex(PVOID Unknown)
{
+ UNIMPLEMENTED
}
/*
VOID NTAPI
USBD_FreeDeviceName(PVOID Unknown)
{
+ UNIMPLEMENTED
}
/*
VOID NTAPI
USBD_WaitDeviceMutex(PVOID Unknown)
{
+ UNIMPLEMENTED
}
/*
ULONG NTAPI
USBD_GetSuspendPowerState(ULONG Unknown1)
{
+ UNIMPLEMENTED
return 0;
}
USBD_InitializeDevice(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3,
ULONG Unknown4, ULONG Unknown5, ULONG Unknown6)
{
+ UNIMPLEMENTED
return STATUS_NOT_SUPPORTED;
}
ULONG Unknown4, ULONG Unknown5, ULONG Unknown6, ULONG Unknown7,
ULONG Unknown8, ULONG Unknown9, ULONG Unknown10)
{
+ UNIMPLEMENTED
return STATUS_NOT_SUPPORTED;
}
NTSTATUS NTAPI
USBD_GetDeviceInformation(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3)
{
+ UNIMPLEMENTED
return STATUS_NOT_SUPPORTED;
}
USBD_CreateDevice(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3,
ULONG Unknown4, ULONG Unknown5)
{
+ UNIMPLEMENTED
return STATUS_NOT_SUPPORTED;
}
NTSTATUS NTAPI
USBD_RemoveDevice(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3)
{
+ UNIMPLEMENTED
return STATUS_NOT_SUPPORTED;
}
VOID NTAPI
USBD_CompleteRequest(ULONG Unknown1, ULONG Unknown2)
{
+ UNIMPLEMENTED
}
/*
PDEVICE_OBJECT FilterDeviceObject
)
{
+ UNIMPLEMENTED
}
/*
VOID NTAPI
USBD_SetSuspendPowerState(ULONG Unknown1, ULONG Unknown2)
{
+ UNIMPLEMENTED
}
/*
NTSTATUS NTAPI
USBD_MakePdoName(ULONG Unknown1, ULONG Unknown2)
{
+ UNIMPLEMENTED
return STATUS_NOT_SUPPORTED;
}
PULONG CurrentFrame
)
{
+ UNIMPLEMENTED
return STATUS_NOT_SUPPORTED;
}
if (Version != NULL)
{
Version->USBDI_Version = USBDI_VERSION;
- Version->Supported_USB_Version = 0x100;
+ Version->Supported_USB_Version = 0x200;
}
}
NTSTATUS NTAPI
USBD_RestoreDevice(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3)
{
+ UNIMPLEMENTED
return STATUS_NOT_SUPPORTED;
}
USBD_RegisterHcDeviceCapabilities(ULONG Unknown1, ULONG Unknown2,
ULONG Unknown3)
{
+ UNIMPLEMENTED
}
/*
NTSTATUS Status;
HANDLE DevInstRegKey;
+ /* Open the device key */
Status = IoOpenDeviceRegistryKey(PhysicalDeviceObject,
- PLUGPLAY_REGKEY_DRIVER, STANDARD_RIGHTS_ALL, &DevInstRegKey);
+ PLUGPLAY_REGKEY_DEVICE, STANDARD_RIGHTS_ALL, &DevInstRegKey);
if (NT_SUCCESS(Status))
{
- PKEY_VALUE_FULL_INFORMATION FullInfo;
+ PKEY_VALUE_PARTIAL_INFORMATION PartialInfo;
UNICODE_STRING ValueName;
ULONG Length;
- RtlInitUnicodeString(&ValueName, KeyName);
- Length = ParameterLength + KeyNameLength + sizeof(KEY_VALUE_FULL_INFORMATION);
- FullInfo = ExAllocatePool(PagedPool, Length);
- if (FullInfo)
+ /* Initialize the unicode string based on caller data */
+ ValueName.Buffer = KeyName;
+ ValueName.Length = ValueName.MaximumLength = KeyNameLength;
+
+ Length = ParameterLength + sizeof(KEY_VALUE_PARTIAL_INFORMATION);
+ PartialInfo = ExAllocatePool(PagedPool, Length);
+ if (PartialInfo)
{
Status = ZwQueryValueKey(DevInstRegKey, &ValueName,
- KeyValueFullInformation, FullInfo, Length, &Length);
+ KeyValuePartialInformation, PartialInfo, Length, &Length);
+ if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL)
+ {
+ /* The caller doesn't want all the data */
+ ExFreePool(PartialInfo);
+ PartialInfo = ExAllocatePool(PagedPool, Length);
+ if (PartialInfo)
+ {
+ Status = ZwQueryValueKey(DevInstRegKey, &ValueName,
+ KeyValuePartialInformation, PartialInfo, Length, &Length);
+ }
+ else
+ {
+ Status = STATUS_NO_MEMORY;
+ }
+ }
+
if (NT_SUCCESS(Status))
{
+ /* Compute the length to copy back */
+ if (ParameterLength < PartialInfo->DataLength)
+ Length = ParameterLength;
+ else
+ Length = PartialInfo->DataLength;
+
RtlCopyMemory(Parameter,
- ((PUCHAR)FullInfo) + FullInfo->DataOffset,
- ParameterLength /*FullInfo->DataLength*/);
+ PartialInfo->Data,
+ Length);
+ }
+
+ if (PartialInfo)
+ {
+ ExFreePool(PartialInfo);
}
- ExFreePool(FullInfo);
} else
Status = STATUS_NO_MEMORY;
ZwClose(DevInstRegKey);