reactos/drivers/usb/usbehci/misc.c
Timo Kreuzer 912ce51ae6 [CMAKE]
Sync with trunk head (r48826)

svn path=/branches/cmake-bringup/; revision=48831
2010-09-20 17:27:52 +00:00

137 lines
4.1 KiB
C

/*
* PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
* LICENSE: GPL - See COPYING in the top level directory
* FILE: drivers/usb/usbehci/misc.c
* PURPOSE: Misceallenous operations.
* PROGRAMMERS:
* Michael Martin (michael.martin@reactos.org)
*/
#include "usbehci.h"
#include <hubbusif.h>
#include <usbbusif.h>
/*
Get SymblicName from Parameters in Registry Key
Caller is responsible for freeing pool of returned pointer
*/
PWSTR
GetSymbolicName(PDEVICE_OBJECT DeviceObject)
{
NTSTATUS Status;
HANDLE DevInstRegKey;
UNICODE_STRING SymbolicName;
PKEY_VALUE_PARTIAL_INFORMATION KeyPartInfo;
ULONG SizeNeeded;
PWCHAR SymbolicNameString = NULL;
Status = IoOpenDeviceRegistryKey(DeviceObject,
PLUGPLAY_REGKEY_DEVICE,
STANDARD_RIGHTS_ALL,
&DevInstRegKey);
DPRINT("IoOpenDeviceRegistryKey PLUGPLAY_REGKEY_DEVICE Status %x\n", Status);
if (NT_SUCCESS(Status))
{
RtlInitUnicodeString(&SymbolicName, L"SymbolicName");
Status = ZwQueryValueKey(DevInstRegKey,
&SymbolicName,
KeyValuePartialInformation,
NULL,
0,
&SizeNeeded);
DPRINT("ZwQueryValueKey status %x, %d\n", Status, SizeNeeded);
if (Status == STATUS_BUFFER_TOO_SMALL)
{
KeyPartInfo = (PKEY_VALUE_PARTIAL_INFORMATION ) ExAllocatePool(PagedPool, SizeNeeded);
if (!KeyPartInfo)
{
DPRINT1("OUT OF MEMORY\n");
return NULL;
}
else
{
Status = ZwQueryValueKey(DevInstRegKey,
&SymbolicName,
KeyValuePartialInformation,
KeyPartInfo,
SizeNeeded,
&SizeNeeded);
SymbolicNameString = ExAllocatePool(PagedPool, (KeyPartInfo->DataLength + sizeof(WCHAR)));
if (!SymbolicNameString)
{
return NULL;
}
RtlZeroMemory(SymbolicNameString, KeyPartInfo->DataLength + 2);
RtlCopyMemory(SymbolicNameString, KeyPartInfo->Data, KeyPartInfo->DataLength);
}
ExFreePool(KeyPartInfo);
}
ZwClose(DevInstRegKey);
}
return SymbolicNameString;
}
/*
Get Physical Device Object Name from registry
Caller is responsible for freeing pool
*/
PWSTR
GetPhysicalDeviceObjectName(PDEVICE_OBJECT DeviceObject)
{
NTSTATUS Status;
PWSTR ObjectName = NULL;
ULONG SizeNeeded;
Status = IoGetDeviceProperty(DeviceObject,
DevicePropertyPhysicalDeviceObjectName,
0,
NULL,
&SizeNeeded);
if (Status != STATUS_BUFFER_TOO_SMALL)
{
DPRINT1("Expected STATUS_BUFFER_TOO_SMALL, got %x!\n", Status);
return NULL;
}
ObjectName = (PWSTR) ExAllocatePool(PagedPool, SizeNeeded + sizeof(WCHAR));
if (!ObjectName)
{
DPRINT1("Out of memory\n");
return NULL;
}
Status = IoGetDeviceProperty(DeviceObject,
DevicePropertyPhysicalDeviceObjectName,
SizeNeeded,
ObjectName,
&SizeNeeded);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to Get Property\n");
return NULL;
}
return ObjectName;
}
PUSB_DEVICE DeviceHandleToUsbDevice(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PUSB_DEVICE_HANDLE DeviceHandle)
{
LONG i;
for (i=0; i<127; i++)
{
if (PdoDeviceExtension->UsbDevices[i] == (PUSB_DEVICE)DeviceHandle)
return (PUSB_DEVICE)DeviceHandle;
}
return NULL;
}