usbd.sys implementation - done long time ago by Filip, I just added .def
and changed .rc (I think he doesn't mind it :))
Added: trunk/reactos/drivers/usb/usbd/
Added: trunk/reactos/drivers/usb/usbd/makefile
Added: trunk/reactos/drivers/usb/usbd/test.c
Added: trunk/reactos/drivers/usb/usbd/usbd.c
Added: trunk/reactos/drivers/usb/usbd/usbd.def
Added: trunk/reactos/drivers/usb/usbd/usbd.rc
_____
Added: trunk/reactos/drivers/usb/usbd/makefile
--- trunk/reactos/drivers/usb/usbd/makefile 2005-02-04 12:27:34 UTC
(rev 13403)
+++ trunk/reactos/drivers/usb/usbd/makefile 2005-02-04 16:49:17 UTC
(rev 13404)
@@ -0,0 +1,17 @@
+# $Id: $
+
+PATH_TO_TOP = ../../..
+
+TARGET_TYPE = export_driver
+
+TARGET_NAME = usbd
+
+TARGET_OBJECTS = usbd.o
+
+TARGET_GCCLIBS = gcc
+
+TARGET_CFLAGS = -D__USE_W32API -O3 -s
+
+include $(PATH_TO_TOP)/rules.mak
+
+include $(TOOLS_PATH)/helper.mk
_____
Added: trunk/reactos/drivers/usb/usbd/test.c
--- trunk/reactos/drivers/usb/usbd/test.c 2005-02-04 12:27:34 UTC
(rev 13403)
+++ trunk/reactos/drivers/usb/usbd/test.c 2005-02-04 16:49:17 UTC
(rev 13404)
@@ -0,0 +1,33 @@
+#include <stdio.h>
+#include <windows.h>
+#include <ddk/usbdi.h>
+
+typedef ULONG STDCALL
+(*USBD_GetInterfaceLengthTYPE)(
+ PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor,
+ PUCHAR BufferEnd
+ );
+
+int main()
+{
+ HMODULE Lib;
+ USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
+ USBD_GetInterfaceLengthTYPE USBD_GetInterfaceLength;
+
+ InterfaceDescriptor.bLength = 10;
+ InterfaceDescriptor.bNumEndpoints = 2;
+ InterfaceDescriptor.bDescriptorType =
/*USB_INTERFACE_DESCRIPTOR_TYPE*/2;
+ InterfaceDescriptor.iInterface = 0x1;
+
+ Lib = LoadLibraryEx("usbd.sys", NULL, DONT_RESOLVE_DLL_REFERENCES);
+ USBD_GetInterfaceLength =
(USBD_GetInterfaceLengthTYPE)GetProcAddress(Lib,
"USBD_GetInterfaceLength");
+ printf("%X\n", USBD_GetInterfaceLength(&InterfaceDescriptor,
(PUCHAR)((DWORD)&InterfaceDescriptor + sizeof(InterfaceDescriptor))));
+ FreeLibrary(Lib);
+
+ Lib = LoadLibraryEx("usbd.ms", NULL, DONT_RESOLVE_DLL_REFERENCES);
+ USBD_GetInterfaceLength =
(USBD_GetInterfaceLengthTYPE)GetProcAddress(Lib,
"USBD_GetInterfaceLength");
+ printf("%X\n", USBD_GetInterfaceLength(&InterfaceDescriptor,
(PUCHAR)((DWORD)&InterfaceDescriptor + sizeof(InterfaceDescriptor))));
+ FreeLibrary(Lib);
+ return 0;
+}
+
_____
Added: trunk/reactos/drivers/usb/usbd/usbd.c
--- trunk/reactos/drivers/usb/usbd/usbd.c 2005-02-04 12:27:34 UTC
(rev 13403)
+++ trunk/reactos/drivers/usb/usbd/usbd.c 2005-02-04 16:49:17 UTC
(rev 13404)
@@ -0,0 +1,457 @@
+/*
+ * Universal Serial Bus Driver/Helper Library
+ *
+ * Written by Filip Navara <xnavara(a)volny.cz>
+ *
+ * Notes:
+ * This driver was obsoleted in Windows XP and most functions
+ * became pure stubs. But some of them were retained for backward
+ * compatibilty with existing drivers.
+ *
+ * Preserved functions:
+ *
+ * USBD_Debug_GetHeap (implemented)
+ * USBD_Debug_RetHeap (implemented)
+ * USBD_CalculateUsbBandwidth (implemented, tested)
+ * USBD_CreateConfigurationRequestEx (implemented)
+ * USBD_CreateConfigurationRequest
+ * USBD_GetInterfaceLength (implemented)
+ * USBD_ParseConfigurationDescriptorEx
+ * USBD_ParseDescriptors
+ * USBD_GetPdoRegistryParameters (implemented)
+ */
+
+#include <windows.h>
+#include <ddk/usbdi.h>
+#ifndef PLUGPLAY_REGKEY_DRIVER
+#define PLUGPLAY_REGKEY_DRIVER 2
+#endif
+typedef struct _USBD_INTERFACE_LIST_ENTRY {
+ PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
+ PUSBD_INTERFACE_INFORMATION Interface;
+} USBD_INTERFACE_LIST_ENTRY, *PUSBD_INTERFACE_LIST_ENTRY;
+
+NTSTATUS STDCALL
+DriverEntry(PDRIVER_OBJECT DriverObject,
+ PUNICODE_STRING RegistryPath)
+{
+ return STATUS_SUCCESS;
+}
+
+/*
+ * @implemented
+ */
+DWORD STDCALL
+DllInitialize(DWORD Unknown)
+{
+ return 0;
+}
+
+/*
+ * @implemented
+ */
+DWORD STDCALL
+DllUnload(VOID)
+{
+ return 0;
+}
+
+/*
+ * @implemented
+ */
+PVOID STDCALL
+USBD_Debug_GetHeap(DWORD Unknown1, POOL_TYPE PoolType, ULONG
NumberOfBytes,
+ ULONG Tag)
+{
+ return ExAllocatePoolWithTag(PoolType, NumberOfBytes, Tag);
+}
+
+/*
+ * @implemented
+ */
+VOID STDCALL
+USBD_Debug_RetHeap(PVOID Heap, DWORD Unknown2, DWORD Unknown3)
+{
+ ExFreePool(Heap);
+}
+
+/*
+ * @implemented
+ */
+VOID STDCALL
+USBD_Debug_LogEntry(PCHAR Name, ULONG_PTR Info1, ULONG_PTR Info2,
+ ULONG_PTR Info3)
+{
+}
+
+/*
+ * @implemented
+ */
+PVOID STDCALL
+USBD_AllocateDeviceName(DWORD Unknown)
+{
+ return NULL;
+}
+
+/*
+ * @implemented
+ */
+DWORD STDCALL
+USBD_CalculateUsbBandwidth(
+ ULONG MaxPacketSize,
+ UCHAR EndpointType,
+ BOOLEAN LowSpeed
+ )
+{
+ DWORD OverheadTable[] = {
+ 0x00, /* UsbdPipeTypeControl */
+ 0x09, /* UsbdPipeTypeIsochronous */
+ 0x00, /* UsbdPipeTypeBulk */
+ 0x0d /* UsbdPipeTypeInterrupt */
+ };
+ DWORD Result;
+
+ if (OverheadTable[EndpointType] != 0)
+ {
+ Result = ((MaxPacketSize + OverheadTable[EndpointType]) * 8 *
7) / 6;
+ if (LowSpeed)
+ return Result << 3;
+ return Result;
+ }
+ return 0;
+}
+
+/*
+ * @implemented
+ */
+DWORD STDCALL
+USBD_Dispatch(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3, DWORD
Unknown4)
+{
+ return 1;
+}
+
+/*
+ * @implemented
+ */
+VOID STDCALL
+USBD_FreeDeviceMutex(PVOID Unknown)
+{
+}
+
+/*
+ * @implemented
+ */
+VOID STDCALL
+USBD_FreeDeviceName(PVOID Unknown)
+{
+}
+
+/*
+ * @implemented
+ */
+VOID STDCALL
+USBD_WaitDeviceMutex(PVOID Unknown)
+{
+}
+
+/*
+ * @implemented
+ */
+DWORD STDCALL
+USBD_GetSuspendPowerState(DWORD Unknown1)
+{
+ return 0;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS STDCALL
+USBD_InitializeDevice(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3,
+ DWORD Unknown4, DWORD Unknown5, DWORD Unknown6)
+{
+ return STATUS_NOT_SUPPORTED;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS STDCALL
+USBD_RegisterHostController(DWORD Unknown1, DWORD Unknown2, DWORD
Unknown3,
+ DWORD Unknown4, DWORD Unknown5, DWORD Unknown6, DWORD Unknown7,
+ DWORD Unknown8, DWORD Unknown9, DWORD Unknown10)
+{
+ return STATUS_NOT_SUPPORTED;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS STDCALL
+USBD_GetDeviceInformation(DWORD Unknown1, DWORD Unknown2, DWORD
Unknown3)
+{
+ return STATUS_NOT_SUPPORTED;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS STDCALL
+USBD_CreateDevice(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3,
+ DWORD Unknown4, DWORD Unknown5)
+{
+ return STATUS_NOT_SUPPORTED;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS STDCALL
+USBD_RemoveDevice(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3)
+{
+ return STATUS_NOT_SUPPORTED;
+}
+
+/*
+ * @implemented
+ */
+VOID STDCALL
+USBD_CompleteRequest(DWORD Unknown1, DWORD Unknown2)
+{
+}
+
+/*
+ * @implemented
+ */
+VOID STDCALL
+USBD_RegisterHcFilter(
+ PDEVICE_OBJECT DeviceObject,
+ PDEVICE_OBJECT FilterDeviceObject
+ )
+{
+}
+
+/*
+ * @implemented
+ */
+VOID STDCALL
+USBD_SetSuspendPowerState(DWORD Unknown1, DWORD Unknown2)
+{
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS STDCALL
+USBD_MakePdoName(DWORD Unknown1, DWORD Unknown2)
+{
+ return STATUS_NOT_SUPPORTED;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS STDCALL
+USBD_QueryBusTime(
+ PDEVICE_OBJECT RootHubPdo,
+ PULONG CurrentFrame
+ )
+{
+ return STATUS_NOT_SUPPORTED;
+}
+
+/*
+ * @implemented
+ */
+VOID STDCALL
+USBD_GetUSBDIVersion(
+ PUSBD_VERSION_INFORMATION Version
+ )
+{
+ if (Version != NULL)
+ {
+ Version->USBDI_Version = USBDI_VERSION;
+ Version->Supported_USB_Version = 0x100;
+ }
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS STDCALL
+USBD_RestoreDevice(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3)
+{
+ return STATUS_NOT_SUPPORTED;
+}
+
+/*
+ * @implemented
+ */
+VOID STDCALL
+USBD_RegisterHcDeviceCapabilities(DWORD Unknown1, DWORD Unknown2,
+ DWORD Unknown3)
+{
+}
+
+/*
+ * @implemented
+ * FIXME: Test
+ */
+PURB
+STDCALL
+USBD_CreateConfigurationRequestEx(
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
+ PUSBD_INTERFACE_LIST_ENTRY InterfaceList
+ )
+{
+ PURB Urb;
+ DWORD UrbSize;
+ DWORD InterfaceCount;
+
+ for (InterfaceCount = 0;
+ InterfaceList[InterfaceCount].InterfaceDescriptor != NULL;
+ ++InterfaceCount)
+ ;
+ /* Include the NULL entry */
+ ++InterfaceCount;
+
+ UrbSize = sizeof(Urb->UrbSelectConfiguration) +
+ (InterfaceCount * sizeof(PUSBD_INTERFACE_LIST_ENTRY));
+ Urb = ExAllocatePool(NonPagedPool, UrbSize);
+ Urb->UrbSelectConfiguration.Hdr.Function =
+ URB_FUNCTION_SELECT_CONFIGURATION;
+ Urb->UrbSelectConfiguration.Hdr.Length =
+ sizeof(Urb->UrbSelectConfiguration);
+ Urb->UrbSelectConfiguration.ConfigurationDescriptor =
+ ConfigurationDescriptor;
+ memcpy((PVOID)&Urb->UrbSelectConfiguration.Interface,
(PVOID)InterfaceList,
+ InterfaceCount * sizeof(PUSBD_INTERFACE_LIST_ENTRY));
+
+ return Urb;
+}
+
+/*
+ * @unimplemented
+ */
+PURB STDCALL
+USBD_CreateConfigurationRequest(
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
+ PUSHORT Size
+ )
+{
+ return NULL;
+}
+
+/*
+ * @unimplemented
+ */
+ULONG STDCALL
+USBD_GetInterfaceLength(
+ PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor,
+ PUCHAR BufferEnd
+ )
+{
+ PUSB_INTERFACE_DESCRIPTOR CurrentDescriptor = InterfaceDescriptor;
+ DWORD Length = CurrentDescriptor->bLength;
+
+ // USB_ENDPOINT_DESCRIPTOR_TYPE
+ if (CurrentDescriptor->bDescriptorType ==
USB_INTERFACE_DESCRIPTOR_TYPE)
+ {
+ for (;
+ (PUCHAR)CurrentDescriptor < BufferEnd;
+ (PVOID)CurrentDescriptor += CurrentDescriptor->bLength)
+ Length += CurrentDescriptor->bLength;
+
+ }
+ return Length;
+}
+
+/*
+ * @unimplemented
+ */
+PUSB_INTERFACE_DESCRIPTOR STDCALL
+USBD_ParseConfigurationDescriptorEx(
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
+ PVOID StartPosition,
+ LONG InterfaceNumber,
+ LONG AlternateSetting,
+ LONG InterfaceClass,
+ LONG InterfaceSubClass,
+ LONG InterfaceProtocol
+ )
+{
+ return NULL;
+}
+
+/*
+ * @implemented
+ */
+PUSB_INTERFACE_DESCRIPTOR STDCALL
+USBD_ParseConfigurationDescriptor(
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
+ UCHAR InterfaceNumber,
+ UCHAR AlternateSetting
+ )
+{
+ return USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor,
+ (PVOID)ConfigurationDescriptor, InterfaceNumber,
AlternateSetting,
+ -1, -1, -1);
+}
+
+/*
+ * @unimplemented
+ */
+PUSB_COMMON_DESCRIPTOR STDCALL
+USBD_ParseDescriptors(
+ PVOID DescriptorBuffer,
+ ULONG TotalLength,
+ PVOID StartPosition,
+ LONG DescriptorType
+ )
+{
+ return NULL;
+}
+
+/*
+ * @implemented
+ */
+DWORD STDCALL
+USBD_GetPdoRegistryParameter(
+ PDEVICE_OBJECT PhysicalDeviceObject,
+ PVOID Parameter,
+ ULONG ParameterLength,
+ PWCHAR KeyName,
+ ULONG KeyNameLength
+ )
+{
+ NTSTATUS Status;
+ HANDLE DevInstRegKey;
+
+ Status = IoOpenDeviceRegistryKey(PhysicalDeviceObject,
+ PLUGPLAY_REGKEY_DRIVER, STANDARD_RIGHTS_ALL, &DevInstRegKey);
+ if (NT_SUCCESS(Status))
+ {
+ PKEY_VALUE_FULL_INFORMATION FullInfo;
+ UNICODE_STRING ValueName;
+ ULONG Length;
+
+ RtlInitUnicodeString(&ValueName, KeyName);
+ Length = ParameterLength + KeyNameLength +
sizeof(KEY_VALUE_FULL_INFORMATION);
+ FullInfo = ExAllocatePool(PagedPool, Length);
+ if (FullInfo)
+ {
+ Status = ZwQueryValueKey(DevInstRegKey, &ValueName,
+ KeyValueFullInformation, FullInfo, Length, &Length);
+ if (NT_SUCCESS(Status))
+ {
+ RtlCopyMemory(Parameter,
+ ((PUCHAR)FullInfo) + FullInfo->DataOffset,
+ ParameterLength /*FullInfo->DataLength*/);
+ }
+ ExFreePool(FullInfo);
+ } else
+ Status = STATUS_NO_MEMORY;
+ ZwClose(DevInstRegKey);
+ }
+ return Status;
+}
_____
Added: trunk/reactos/drivers/usb/usbd/usbd.def
--- trunk/reactos/drivers/usb/usbd/usbd.def 2005-02-04 12:27:34 UTC
(rev 13403)
+++ trunk/reactos/drivers/usb/usbd/usbd.def 2005-02-04 16:49:17 UTC
(rev 13404)
@@ -0,0 +1,13 @@
+;
+; Exports definition file for usbd.sys
+;
+EXPORTS
+USBD_Debug_GetHeap@16
+USBD_Debug_RetHeap@12
+USBD_CalculateUsbBandwidth@12
+USBD_CreateConfigurationRequestEx@8
+USBD_CreateConfigurationRequest@8
+USBD_GetInterfaceLength@8
+USBD_ParseConfigurationDescriptorEx@28
+USBD_ParseDescriptors@16
+;USBD_GetPdoRegistryParameters
_____
Added: trunk/reactos/drivers/usb/usbd/usbd.rc
--- trunk/reactos/drivers/usb/usbd/usbd.rc 2005-02-04 12:27:34 UTC
(rev 13403)
+++ trunk/reactos/drivers/usb/usbd/usbd.rc 2005-02-04 16:49:17 UTC
(rev 13404)
@@ -0,0 +1,5 @@
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION "USBD Legacy Driver\0"
+#define REACTOS_STR_INTERNAL_NAME "usbd\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "usbd.sys\0"
+#include <reactos/version.rc>