diff --git a/libusb/Makefile b/libusb/Makefile index 6c05d30..5956632 100644 --- a/libusb/Makefile +++ b/libusb/Makefile @@ -35,6 +35,9 @@ endif ifdef cflags DBG_DEFINE = $(cflags) endif +ifdef ddk + DDK_INCLUDE = -I$(ddk)/include/ddk +endif CC = $(host_prefix)gcc LD = $(host_prefix)ld @@ -87,8 +90,10 @@ LIBWDI_OBJECTS = $(LIBWDI_DIR)/logging.5.o \ INCLUDES = -I./src -I./src/driver -I. +driver: INCLUDES += $(DDK_INCLUDE) CFLAGS = -O2 -Wall -DWINVER=0x500 $(DBG_DEFINE) +CFLAGS += -Wno-unknown-pragmas -Wno-multichar WIN_CFLAGS = $(CFLAGS) -mwindows WINDRES_FLAGS = -I$(SRC_DIR) @@ -121,9 +126,14 @@ LIBWDI_DLL_LDFLAGS = -s -shared \ -Wl,--enable-stdcall-fixup \ -L. -lnewdev -lsetupapi -lole32 -DRIVER_LDFLAGS = -s -shared -Wl,--entry,_DriverEntry@8 \ +DRIVER_LDFLAGS = -s -shared -Wl,--entry,$(DRIVERENTRY) \ -nostartfiles -nostdlib -L. -lusbd -lntoskrnl -lhal +ifneq (,$(findstring x86, $(host_prefix))) +DRIVERENTRY = DriverEntry +else +DRIVERENTRY = _DriverEntry@8 +endif .PHONY: all all: dll filter test testwin diff --git a/libusb/src/driver/dispatch.c b/libusb/src/driver/dispatch.c index 8eccb21..87bdbb3 100644 --- a/libusb/src/driver/dispatch.c +++ b/libusb/src/driver/dispatch.c @@ -58,6 +58,10 @@ NTSTATUS DDKAPI dispatch(DEVICE_OBJECT *device_object, IRP *irp) case IRP_MJ_CREATE: + USBDBG("IRP_MJ_CREATE: is-filter=%c %s\n", + dev->is_filter ? 'Y' : 'N', + dev->device_id); + if (dev->is_started) { // only one driver can act as power policy owner and @@ -79,6 +83,10 @@ NTSTATUS DDKAPI dispatch(DEVICE_OBJECT *device_object, IRP *irp) case IRP_MJ_CLOSE: + USBDBG("IRP_MJ_CLOSE: is-filter=%c %s\n", + dev->is_filter ? 'Y' : 'N', + dev->device_id); + /* release all interfaces bound to this file object */ release_all_interfaces(dev, stack_location->FileObject); return complete_irp(irp, STATUS_SUCCESS, 0); diff --git a/libusb/src/driver/driver_registry.c b/libusb/src/driver/driver_registry.c index 8ec14fc..3376bc0 100644 --- a/libusb/src/driver/driver_registry.c +++ b/libusb/src/driver/driver_registry.c @@ -19,6 +19,7 @@ #include "libusb_driver.h" #include "lusb_defdi_guids.h" +#include /* missing in mingw's ddk headers */ #ifndef PLUGPLAY_REGKEY_DEVICE diff --git a/libusb/src/driver/get_interface.c b/libusb/src/driver/get_interface.c index b218281..d0b13d3 100644 --- a/libusb/src/driver/get_interface.c +++ b/libusb/src/driver/get_interface.c @@ -28,7 +28,6 @@ NTSTATUS get_interface(libusb_device_t *dev, { NTSTATUS status = STATUS_SUCCESS; URB urb; - PUSB_INTERFACE_DESCRIPTOR interface_descriptor; USBMSG("interface: %d timeout: %d\n", interface_number, timeout); diff --git a/libusb/src/driver/ioctl.c b/libusb/src/driver/ioctl.c index f38a9ab..771d6f4 100644 --- a/libusb/src/driver/ioctl.c +++ b/libusb/src/driver/ioctl.c @@ -344,7 +344,7 @@ NTSTATUS dispatch_ioctl(libusb_device_t *dev, IRP *irp) } else { - status = get_configuration(dev, output_buffer, &ret, request->timeout); + status = get_configuration(dev, (unsigned char *)output_buffer, &ret, request->timeout); } break; @@ -370,7 +370,7 @@ NTSTATUS dispatch_ioctl(libusb_device_t *dev, IRP *irp) status = get_interface( dev, request->intf.interface_number, - output_buffer, + (unsigned char *)output_buffer, request->timeout); if (NT_SUCCESS(status)) diff --git a/libusb/src/driver/libusb_driver.c b/libusb/src/driver/libusb_driver.c index 30f2c69..58c108f 100644 --- a/libusb/src/driver/libusb_driver.c +++ b/libusb/src/driver/libusb_driver.c @@ -45,6 +45,8 @@ const char* attached_driver_wdf_list[] = static bool_t match_driver(PDEVICE_OBJECT deviceObject, const char* driverString); +static RTL_OSVERSIONINFOW os_version; +static POOL_TYPE alloc_pool; #ifdef DBG @@ -121,6 +123,26 @@ NTSTATUS DDKAPI DriverEntry(DRIVER_OBJECT *driver_object, driver_object->DriverExtension->AddDevice = add_device; driver_object->DriverUnload = unload; + /* Determine running OS version */ + os_version.dwOSVersionInfoSize = sizeof(os_version); + if (!NT_SUCCESS(RtlGetVersion(&os_version))) + { + os_version.dwMajorVersion = 5; + os_version.dwMinorVersion = 0; + } + + /* Windows 8 needs non-executable paged pool to pass verification test */ + if (os_version.dwMajorVersion > 6 || + (os_version.dwMajorVersion == 6 && os_version.dwMinorVersion >= 2)) + { + alloc_pool = 512; /* NonPagedPoolNx - Windows 8 and up */ + } + else + { + /* Windows 7 and below only has normal paged pool */ + alloc_pool = NonPagedPool; + } + return STATUS_SUCCESS; } @@ -771,26 +793,25 @@ USB_INTERFACE_DESCRIPTOR* find_interface_desc_ex(USB_CONFIGURATION_DESCRIPTOR *c #define INTF_FIELD 0 #define ALTF_FIELD 1 - usb_descriptor_header_t *desc = (usb_descriptor_header_t *)config_desc; + usb_descriptor_header_t *desc = (usb_descriptor_header_t *)config_desc; char *p = (char *)desc; - int lastInfNumber, lastAltNumber; - int currentInfIndex; - short InterfacesByIndex[LIBUSB_MAX_NUMBER_OF_INTERFACES][2]; + int currentInfIndex; + short InterfacesByIndex[LIBUSB_MAX_NUMBER_OF_INTERFACES][2]; USB_INTERFACE_DESCRIPTOR *if_desc = NULL; - memset(InterfacesByIndex,0xFF,sizeof(InterfacesByIndex)); + memset(InterfacesByIndex,0xFF,sizeof(InterfacesByIndex)); if (!config_desc) return NULL; - size = size > config_desc->wTotalLength ? config_desc->wTotalLength : size; + size = size > config_desc->wTotalLength ? config_desc->wTotalLength : size; while (size && desc->length <= size) { if (desc->type == USB_INTERFACE_DESCRIPTOR_TYPE) { - // this is a new interface or alternate interface + // this is a new interface or alternate interface if_desc = (USB_INTERFACE_DESCRIPTOR *)desc; for (currentInfIndex=0; currentInfIndex 6) || ((major == 6) && (minor >= 2))) - { - pool = 512; /* NonPagedPoolNx - Windows 8 and up */ - } - return ExAllocatePool(pool, bytes); + return ExAllocatePool(alloc_pool, bytes); } diff --git a/libusb/src/driver/libusb_driver.h b/libusb/src/driver/libusb_driver.h index f2ca21c..7155814 100644 --- a/libusb/src/driver/libusb_driver.h +++ b/libusb/src/driver/libusb_driver.h @@ -24,17 +24,14 @@ //#define SKIP_DEVICES_WINUSB //#define SKIP_DEVICES_PICOPP +#include #ifdef __GNUC__ -#include -#include -#include -#include "usbdlib_gcc.h" +#define NTSTATUS LONG #else -#include #include +#endif #include "usbdi.h" #include "usbdlib.h" -#endif #include #include @@ -45,19 +42,6 @@ #include "error.h" #include "driver_api.h" -/* some missing defines */ -#ifdef __GNUC__ - -#define USBD_TRANSFER_DIRECTION_OUT 0 -#define USBD_TRANSFER_DIRECTION_BIT 0 -#define USBD_TRANSFER_DIRECTION_IN (1 << USBD_TRANSFER_DIRECTION_BIT) -#define USBD_SHORT_TRANSFER_OK_BIT 1 -#define USBD_SHORT_TRANSFER_OK (1 << USBD_SHORT_TRANSFER_OK_BIT) -#define USBD_START_ISO_TRANSFER_ASAP_BIT 2 -#define USBD_START_ISO_TRANSFER_ASAP (1 << USBD_START_ISO_TRANSFER_ASAP_BIT) - -#endif - #define SET_CONFIG_ACTIVE_CONFIG -258 #define USB_RECIP_DEVICE 0x00 @@ -81,7 +65,9 @@ #define LIBUSB_MAX_CONTROL_TRANSFER_TIMEOUT 5000 -#ifndef __GNUC__ +#ifdef __GNUC__ +#define DDKAPI __stdcall +#else #define DDKAPI #endif @@ -140,7 +126,9 @@ typedef int bool_t; #endif +#ifndef __GNUC__ #define USB_ENDPOINT_ADDRESS_MASK 0x0F +#endif #define USB_ENDPOINT_DIR_MASK 0x80 #define LBYTE(w) (w & 0xFF) #define HBYTE(w) ((w>>8) & 0xFF) diff --git a/libusb/src/driver/lusb_defdi_guids.h b/libusb/src/driver/lusb_defdi_guids.h index ce625ad..5bf6025 100644 --- a/libusb/src/driver/lusb_defdi_guids.h +++ b/libusb/src/driver/lusb_defdi_guids.h @@ -2,13 +2,11 @@ #define __LUSB_DEFDI_GUIDS_ #ifndef DEFINE_TO_STR -#define _DEFINE_TO_STR(x) #x -#define DEFINE_TO_STR(x) _DEFINE_TO_STR(x) +#define DEFINE_TO_STR(x) #x #endif #ifndef DEFINE_TO_STRW -#define _DEFINE_TO_STRW(x) L#x -#define DEFINE_TO_STRW(x) _DEFINE_TO_STRW(x) +#define DEFINE_TO_STRW(x) L ## #x #endif #define DEFINE_DEVICE_INTERFACE_GUID(BaseFieldName,BaseGuidName,L1,W1,W2,B1,B2,B3,B4,B5,B6,B7,B8) \ diff --git a/libusb/src/driver/set_configuration.c b/libusb/src/driver/set_configuration.c index 2f94271..cb6fcef 100644 --- a/libusb/src/driver/set_configuration.c +++ b/libusb/src/driver/set_configuration.c @@ -30,7 +30,7 @@ NTSTATUS set_configuration(libusb_device_t *dev, USB_CONFIGURATION_DESCRIPTOR *configuration_descriptor = NULL; USB_INTERFACE_DESCRIPTOR *interface_descriptor = NULL; USBD_INTERFACE_LIST_ENTRY *interfaces = NULL; - int i, j, interface_number, desc_size, config_index, ret; + int i, j, interface_number, desc_size, config_index; // check if this config value is already set if ((configuration > 0) && dev->config.value == configuration) diff --git a/libusb/src/driver/set_interface.c b/libusb/src/driver/set_interface.c index 74b96eb..5fe8d1f 100644 --- a/libusb/src/driver/set_interface.c +++ b/libusb/src/driver/set_interface.c @@ -103,8 +103,6 @@ NTSTATUS set_interface_ex(libusb_device_t *dev, interface_request_t* interface_request, int timeout) { - NTSTATUS status = STATUS_SUCCESS; - USB_INTERFACE_DESCRIPTOR *interface_descriptor = NULL; USBMSG("interface-%s=%d alt-%s=%d timeout=%d\n", diff --git a/libusb/src/driver/transfer.c b/libusb/src/driver/transfer.c index eac01a7..0ac2226 100644 --- a/libusb/src/driver/transfer.c +++ b/libusb/src/driver/transfer.c @@ -393,7 +393,6 @@ NTSTATUS large_transfer(IN libusb_device_t* dev, IN PMDL mdlAddress, IN int totalLength) { - PIO_STACK_LOCATION irpStack; BOOLEAN read; ULONG stageSize; ULONG numIrps; @@ -424,7 +423,6 @@ NTSTATUS large_transfer(IN libusb_device_t* dev, // // initialize vars // - irpStack = IoGetCurrentIrpStackLocation(irp); sequenceID = InterlockedIncrement(&sequence); subRequestContextArray = NULL; @@ -987,6 +985,7 @@ NTSTATUS large_transfer_complete(IN PDEVICE_OBJECT DeviceObjectIsNULL, subRequestByteCount = MmGetMdlByteCount(subUrb->UrbBulkOrInterruptTransfer.TransferBufferMDL); subRequestByteOffset = MmGetMdlByteOffset(subUrb->UrbBulkOrInterruptTransfer.TransferBufferMDL); information = subUrb->UrbBulkOrInterruptTransfer.TransferBufferLength; + (void) subRequestByteOffset; USBDBG("[%s #%d] offset=%d requested=%d transferred=%d\n", dispTransfer, sequenceID, diff --git a/libusb/src/error.c b/libusb/src/error.c index d31a437..be7de53 100644 --- a/libusb/src/error.c +++ b/libusb/src/error.c @@ -23,15 +23,7 @@ #include #if IS_DRIVER - #ifdef __GNUC__ - #define OBJ_KERNEL_HANDLE 0x00000200L - #include - #include - #include - #include "usbdlib_gcc.h" - #else - #include - #endif + #include #else #include #endif diff --git a/libusb/src/install.c b/libusb/src/install.c index 36625dd..49ae5af 100644 --- a/libusb/src/install.c +++ b/libusb/src/install.c @@ -30,15 +30,9 @@ #include #include #include - -#ifdef __GNUC__ -#if defined(_WIN64) -#include -#else -#include -#endif -#else #include + +#ifndef __GNUC__ #define strlwr(p) _strlwr(p) #endif diff --git a/libusb/src/install_filter_win.c b/libusb/src/install_filter_win.c index 1a9d428..7388a34 100644 --- a/libusb/src/install_filter_win.c +++ b/libusb/src/install_filter_win.c @@ -20,15 +20,9 @@ #define INITGUID #include +#include -#ifdef __GNUC__ - #if defined(_WIN64) - #include - #else - #include - #endif -#else - #include +#ifndef __GNUC__ #define strlwr(p) _strlwr(p) #endif diff --git a/libusb/src/registry.c b/libusb/src/registry.c index 4431efe..8dddba0 100644 --- a/libusb/src/registry.c +++ b/libusb/src/registry.c @@ -23,15 +23,9 @@ #include #include #include - -#ifdef __GNUC__ -#if defined(_WIN64) -#include -#else -#include -#endif -#else #include + +#ifndef __GNUC__ #define strlwr(p) _strlwr(p) #endif