ReactOS 0.4.17-dev-1281-g065abb3
driver.cpp File Reference
#include "ucx01000.h"
#include <debug.h>
Include dependency graph for driver.cpp:

Go to the source code of this file.

Macros

#define NDEBUG
 
#define UCX_CONTROL_DEVICE_ATTEMPTS   100
 

Functions

 DECLARE_CONST_UNICODE_STRING (UcxKernelOnlySddl, L"D:P")
 
 _IRQL_requires_ (PASSIVE_LEVEL) static NTSTATUS NTAPI UcxCreateControlDevice(_In_ WDFDRIVER Driver)
 Sends a synchronous IOCTL to the specified device object.
 
static VOID NTAPI UcxEvtDriverUnload (_In_ WDFDRIVER Driver)
 
 CODE_SEG ("INIT") NTSTATUS NTAPI DriverEntry(_In_ PDRIVER_OBJECT DriverObject
 
 if (!NT_SUCCESS(Status))
 
 UcxReadUsbFlags ()
 
 DPRINT ("UCX loaded, control device %wZ\n", &UcxDriver.ControlDeviceName)
 

Variables

DRIVER_INITIALIZE DriverEntry
 
static EVT_WDF_DRIVER_UNLOAD UcxEvtDriverUnload
 
_In_ PUNICODE_STRING RegistryPath
 
WDF_DRIVER_CONFIG Config
 
LARGE_INTEGER Ticks
 
NTSTATUS Status = WdfDriverCreate(DriverObject, RegistryPath, WDF_NO_OBJECT_ATTRIBUTES, &Config, &UcxDriver.Driver)
 
UcxDriver RandomSeed = Ticks.LowPart
 
InitializeListHead & UcxDriver
 
UcxDriver ControllerCount = 0
 
Config DriverInitFlags = WdfDriverInitNonPnpDriver
 
Config EvtDriverUnload = UcxEvtDriverUnload
 
Config DriverPoolTag = UCX_POOL_TAG
 
UcxDriver IoTryQueueWorkItem
 
return STATUS_SUCCESS
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 10 of file driver.cpp.

◆ UCX_CONTROL_DEVICE_ATTEMPTS

#define UCX_CONTROL_DEVICE_ATTEMPTS   100

Definition at line 13 of file driver.cpp.

Function Documentation

◆ _IRQL_requires_()

_IRQL_requires_ ( PASSIVE_LEVEL  )

Sends a synchronous IOCTL to the specified device object.

Parameters
[in]IoControlCodeThe IOCTL to send to the device.
[in]DeviceObjectPointer to the device object that will handle the IOCTL.
[in]InputBufferOptional pointer to a buffer containing input data for the IOCTL. When specified, the buffer should be at least of InputBufferLength size.
[in]InputBufferLengthSize in bytes, of the buffer pointed by InputBuffer.
[out]OutputBufferOptional pointer to a buffer that will receive output data from the IOCTL. When specified, the buffer should be at least of OutputBufferLength size.
[in]OutputBufferLengthSize in bytes, of the buffer pointed by OutputBuffer.
[in]FileObjectOptional pointer to a file object that may be necessary for the IOCTL.
Returns
An NTSTATUS code indicating success or failure of this function.
Note
Must be called at PASSIVE_LEVEL with all APCs enabled.

Definition at line 22 of file driver.cpp.

29{
31 WDFDEVICE Device;
34
35 PAGED_CODE();
36
37 DeviceInit = WdfControlDeviceInitAllocate(Driver, &UcxKernelOnlySddl);
38 if (DeviceInit == NULL)
40
41 RtlInitEmptyUnicodeString(&UcxDriver.ControlDeviceName,
42 UcxDriver.ControlDeviceNameBuffer,
43 sizeof(UcxDriver.ControlDeviceNameBuffer));
44
46 {
47 Status = RtlUnicodeStringPrintf(&UcxDriver.ControlDeviceName, L"\\Device\\UCX%lu", Index);
48 if (!NT_SUCCESS(Status))
49 break;
50
51 Status = WdfDeviceInitAssignName(DeviceInit, &UcxDriver.ControlDeviceName);
52 if (!NT_SUCCESS(Status))
53 break;
54
55 Status = WdfDeviceCreate(&DeviceInit, WDF_NO_OBJECT_ATTRIBUTES, &Device);
56 }
57
58 /* A successful create took the init block over */
59 if (!NT_SUCCESS(Status))
60 {
61 if (DeviceInit != NULL)
62 WdfDeviceInitFree(DeviceInit);
63 return Status;
64 }
65
66 WdfControlFinishInitializing(Device);
67 UcxDriver.ControlDevice = Device;
68
69 return STATUS_SUCCESS;
70}
#define PAGED_CODE()
LONG NTSTATUS
Definition: precomp.h:26
RtlInitEmptyUnicodeString(SymbolicLinkName, NULL, 0)
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define UCX_CONTROL_DEVICE_ATTEMPTS
Definition: driver.cpp:13
InitializeListHead & UcxDriver
Definition: driver.cpp:138
NTSTATUS Status
Definition: driver.cpp:133
return STATUS_SUCCESS
Definition: driver.cpp:176
#define L(x)
Definition: resources.c:13
Status
Definition: gdiplustypes.h:24
return RtlUnicodeStringPrintf(Name, L"uxd_port_%03u", PortNumber)
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
uint32_t ULONG
Definition: typedefs.h:59
WDF_EXTERN_C_START typedef _Inout_ PWDFDEVICE_INIT DeviceInit
Definition: ucxclass.h:37
#define STATUS_OBJECT_NAME_COLLISION
Definition: udferr_usr.h:150
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ PWDFDEVICE_INIT DeviceInit
Definition: wdfcontrol.h:113
_Must_inspect_result_ _In_ WDFDRIVER Driver
Definition: wdfcontrol.h:83
#define WDF_NO_OBJECT_ATTRIBUTES
Definition: wdftypes.h:105

◆ CODE_SEG()

CODE_SEG ( "INIT"  )

Definition at line 246 of file Interface.c.

1817{
1818 UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\FileSystem\\Filters\\"DRIVER_NAME);
1819 PDEVICE_OBJECT RawDeviceObject;
1821 PFILE_OBJECT RawFileObject;
1823 UNICODE_STRING SymLink;
1824
1826
1829
1830 /* Save the registry key for this driver */
1834 RegistryPath->MaximumLength,
1838
1839 /* Do some initialization */
1841
1842 /* Create the main filter manager device object */
1844 0,
1845 &DeviceName,
1848 FALSE,
1849 &DeviceObject);
1850 if (!NT_SUCCESS(Status))
1851 {
1852 DPRINT1("fltmgr IoCreateDevice failed. Status = %X\n", Status);
1853 goto Cleanup;
1854 }
1855
1856 /* Store a global reference so we can access from callbacks */
1858
1859 /* Generate the symbolic link name */
1860 RtlInitUnicodeString(&SymLink, L"\\??\\"DRIVER_NAME);
1862 if (!NT_SUCCESS(Status)) goto Cleanup;
1863
1864 /* Create the callbacks for the dispatch table, FastIo and FS callbacks */
1866 if (!NT_SUCCESS(Status)) goto Cleanup;
1867
1868 /* Initialize the comms objects */
1870 if (!NT_SUCCESS(Status)) goto Cleanup;
1871
1872 /* Register for notifications when a new file system is loaded. This also enumerates any existing file systems */
1874 FLT_ASSERT(Status != STATUS_DEVICE_ALREADY_ATTACHED); // Windows checks for this, I'm not sure how it can happen. Needs investigation??
1875 if (!NT_SUCCESS(Status)) goto Cleanup;
1876
1879
1880 /* IoRegisterFsRegistrationChange isn't notified about the raw file systems, so we attach to them manually */
1881 RtlInitUnicodeString(&ObjectName, L"\\Device\\RawDisk");
1884 &RawFileObject,
1885 &RawDeviceObject);
1886 if (NT_SUCCESS(Status))
1887 {
1888 FltpFsNotification(RawDeviceObject, TRUE);
1889 ObDereferenceObject(RawFileObject);
1890 }
1891
1892 RtlInitUnicodeString(&ObjectName, L"\\Device\\RawCdRom");
1895 &RawFileObject,
1896 &RawDeviceObject);
1897 if (NT_SUCCESS(Status))
1898 {
1899 FltpFsNotification(RawDeviceObject, TRUE);
1900 ObDereferenceObject(RawFileObject);
1901 }
1902
1903 /* We're done, clear the initializing flag */
1906
1907Cleanup:
1908
1909 if (!NT_SUCCESS(Status))
1910 {
1912 {
1913 DriverObject->FastIoDispatch = NULL;
1915 }
1916
1917 IoDeleteSymbolicLink(&SymLink);
1918
1919 if (DeviceObject)
1921
1924 }
1925
1926 return Status;
1927}
LIST_ENTRY FilterList
Definition: Filter.c:24
DRIVER_FS_NOTIFICATION FltpFsNotification
Definition: Interface.c:1699
ERESOURCE FilterListLock
Definition: Filter.c:25
static NTSTATUS SetupDispatchAndCallbacksTables(_In_ PDRIVER_OBJECT DriverObject)
Definition: Interface.c:1739
DRIVER_DATA DriverData
Definition: Interface.c:35
#define DPRINT1
Definition: precomp.h:8
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define RTL_CONSTANT_STRING(s)
Definition: combase.c:35
static const WCHAR Cleanup[]
Definition: register.c:80
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
#define DO_DEVICE_INITIALIZING
Definition: env_spec_w32.h:399
#define NonPagedPool
Definition: env_spec_w32.h:307
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define ClearFlag(_F, _SF)
Definition: ext2fs.h:191
#define DRIVER_NAME
Definition: ext2fs.h:136
#define FLT_ASSERT(_e)
Definition: fltkernel.h:49
#define FM_TAG_REGISTRY_DATA
Definition: fltmgr.h:18
#define FM_TAG_DISPATCH_TABLE
Definition: fltmgr.h:17
NTSTATUS FltpSetupCommunicationObjects(_In_ PDRIVER_OBJECT DriverObject)
Definition: Messaging.c:377
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
#define FILE_READ_ATTRIBUTES
Definition: nt_native.h:647
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1038
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1261
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1455
NTSTATUS NTAPI IoRegisterFsRegistrationChange(IN PDRIVER_OBJECT DriverObject, IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine)
Definition: volume.c:1089
#define STATUS_DEVICE_ALREADY_ATTACHED
Definition: ntstatus.h:386
#define FILE_DEVICE_DISK_FILE_SYSTEM
Definition: winioctl.h:53
#define STATUS_SUCCESS
Definition: shellext.h:65
PDRIVER_OBJECT DriverObject
Definition: fltmgr.h:31
UNICODE_STRING ServiceKey
Definition: fltmgr.h:33
PFAST_IO_DISPATCH FastIoDispatch
Definition: fltmgr.h:37
FAST_MUTEX FilterAttachLock
Definition: fltmgr.h:39
PDEVICE_OBJECT DeviceObject
Definition: fltmgr.h:32
USHORT MaximumLength
Definition: env_spec_w32.h:370
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint16_t * PWCHAR
Definition: typedefs.h:56
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
_In_ PVOID _Out_opt_ PULONG_PTR _Outptr_opt_ PCUNICODE_STRING * ObjectName
Definition: cmfuncs.h:64
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
* PFILE_OBJECT
Definition: iotypes.h:1998
#define ObDereferenceObject
Definition: obfuncs.h:203

◆ DECLARE_CONST_UNICODE_STRING()

DECLARE_CONST_UNICODE_STRING ( UcxKernelOnlySddl  ,
L"D:P"   
)

◆ DPRINT()

DPRINT ( "UCX  loaded,
control device %wZ\n"  ,
&UcxDriver.  ControlDeviceName 
)

◆ if()

if ( !  NT_SUCCESSStatus)

Definition at line 148 of file driver.cpp.

149 {
150 DPRINT1("WdfDriverCreate failed 0x%lx\n", Status);
151 return Status;
152 }

◆ UcxEvtDriverUnload()

static VOID NTAPI UcxEvtDriverUnload ( _In_ WDFDRIVER  Driver)
static

Definition at line 108 of file driver.cpp.

110{
112
113 PAGED_CODE();
114
115 if (UcxDriver.ControlDevice != NULL)
116 {
117 WdfObjectDelete(UcxDriver.ControlDevice);
118 UcxDriver.ControlDevice = NULL;
119 }
120}
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
WdfObjectDelete(String)

◆ UcxReadUsbFlags()

UcxReadUsbFlags ( )

Variable Documentation

◆ Config

Definition at line 131 of file driver.cpp.

◆ ControllerCount

UcxDriver ControllerCount = 0

Definition at line 140 of file driver.cpp.

◆ DriverEntry

DRIVER_INITIALIZE DriverEntry

Definition at line 15 of file driver.cpp.

◆ DriverInitFlags

Config DriverInitFlags = WdfDriverInitNonPnpDriver

Definition at line 143 of file driver.cpp.

◆ DriverPoolTag

Config DriverPoolTag = UCX_POOL_TAG

Definition at line 145 of file driver.cpp.

◆ EvtDriverUnload

Config EvtDriverUnload = UcxEvtDriverUnload

Definition at line 144 of file driver.cpp.

◆ IoTryQueueWorkItem

UcxDriver IoTryQueueWorkItem
Initial value:
=
PVOID NTAPI MmGetSystemRoutineAddress(IN PUNICODE_STRING SystemRoutineName)
Definition: sysldr.c:3672
BOOLEAN(NTAPI * PFN_UCX_IO_TRY_QUEUE_WORKITEM)(_Inout_ PIO_WORKITEM IoWorkItem, _In_ PIO_WORKITEM_ROUTINE_EX WorkerRoutine, _In_ WORK_QUEUE_TYPE QueueType, _In_opt_ PVOID Context)
Definition: ucxutil.h:134

Definition at line 170 of file driver.cpp.

◆ RandomSeed

UcxDriver RandomSeed = Ticks.LowPart

Definition at line 136 of file driver.cpp.

Referenced by FxRandom(), and START_TEST().

◆ RegistryPath

Initial value:
{
DECLARE_CONST_UNICODE_STRING(TryQueueName, L"IoTryQueueWorkItem")
#define DECLARE_CONST_UNICODE_STRING(_variablename, _string)
Definition: wdfcore.h:161

Definition at line 128 of file driver.cpp.

◆ Status

Definition at line 133 of file driver.cpp.

Referenced by _IRQL_requires_(), and if().

◆ STATUS_SUCCESS

return STATUS_SUCCESS

Definition at line 176 of file driver.cpp.

Referenced by _IRQL_requires_().

◆ Ticks

◆ UcxDriver

◆ UcxEvtDriverUnload

EVT_WDF_DRIVER_UNLOAD UcxEvtDriverUnload
static

Definition at line 16 of file driver.cpp.