ReactOS  0.4.13-dev-482-ge57f103
ioctl.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS USB Port Driver
3  * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE: USBPort I/O control functions
5  * COPYRIGHT: Copyright 2017 Vadim Galyant <vgal@rambler.ru>
6  */
7 
8 #include "usbport.h"
9 
10 #define NDEBUG
11 #include <debug.h>
12 
13 VOID
14 NTAPI
16  IN PUSBUSER_CONTROLLER_UNICODE_NAME ControllerName,
17  IN PUSB_UNICODE_NAME UnicodeName)
18 {
20  ULONG Length;
23 
24  DPRINT("USBPORT_UserGetHcName: ... \n");
25 
26  FdoExtension = FdoDevice->DeviceExtension;
27 
28  Length = ControllerName->Header.RequestBufferLength -
29  sizeof(USBUSER_CONTROLLER_UNICODE_NAME);
30 
32 
33  Status = IoGetDeviceProperty(FdoExtension->CommonExtension.LowerPdoDevice,
35  Length,
36  UnicodeName->String,
37  &ResultLength);
38 
39  if (!NT_SUCCESS(Status))
40  {
42  {
43  ControllerName->Header.UsbUserStatusCode = UsbUserBufferTooSmall;
44  }
45  else
46  {
47  ControllerName->Header.UsbUserStatusCode = UsbUserInvalidParameter;
48  }
49  }
50  else
51  {
52  ControllerName->Header.UsbUserStatusCode = UsbUserSuccess;
53  UnicodeName->Length = ResultLength + sizeof(UNICODE_NULL);
54  }
55 
56  ControllerName->Header.ActualBufferLength = sizeof(USBUSER_CONTROLLER_UNICODE_NAME) +
58 }
59 
61 NTAPI
64 {
66  PUNICODE_STRING RootHubName;
67  PWCHAR Buffer;
68  SIZE_T LengthName;
69  SIZE_T Length;
71  WCHAR Character;
72 
73  DPRINT("USBPORT_GetSymbolicName: ... \n");
74 
75  PdoExtension = RootHubPdo->DeviceExtension;
76  RootHubName = &PdoExtension->CommonExtension.SymbolicLinkName;
77  Buffer = RootHubName->Buffer;
78 
79  if (!Buffer)
80  {
81  return STATUS_UNSUCCESSFUL;
82  }
83 
84  LengthName = RootHubName->Length;
85 
87 
88  if (!SourceString)
89  {
92  }
93 
94  RtlZeroMemory(SourceString, LengthName);
95 
96  if (*Buffer == L'\\')
97  {
98  Buffer += 1;
99 
100  if (*Buffer == L'\\')
101  {
102  Buffer += 1;
103  goto Exit;
104  }
105 
106  Character = *Buffer;
107 
108  do
109  {
110  if (Character == UNICODE_NULL)
111  {
112  break;
113  }
114 
115  Buffer += 1;
116  Character = *Buffer;
117  }
118  while (*Buffer != L'\\');
119 
120  if (*Buffer == L'\\')
121  {
122  Buffer += 1;
123  }
124 
125 Exit:
126  Length = (ULONG_PTR)Buffer - (ULONG_PTR)RootHubName->Buffer;
127  }
128  else
129  {
130  Length = 0;
131  }
132 
134  (PVOID)((ULONG_PTR)RootHubName->Buffer + Length),
135  RootHubName->Length - Length);
136 
138 
139  DPRINT("USBPORT_RegisterDeviceInterface: DestinationString - %wZ\n",
141 
142  return STATUS_SUCCESS;
143 }
144 
145 VOID
146 NTAPI
148  IN PUSBUSER_CONTROLLER_UNICODE_NAME RootHubName,
149  IN PUSB_UNICODE_NAME UnicodeName)
150 {
153  ULONG Length;
154  ULONG ResultLength = 0;
156 
157  DPRINT("USBPORT_UserGetRootHubName: ... \n");
158 
159  FdoExtension = FdoDevice->DeviceExtension;
160 
161  Length = RootHubName->Header.RequestBufferLength -
162  sizeof(USBUSER_CONTROLLER_UNICODE_NAME);
163 
165 
167 
168  if (NT_SUCCESS(Status))
169  {
170  ResultLength = UnicodeString.Length;
171 
172  if (UnicodeString.Length > Length)
173  {
174  UnicodeString.Length = Length;
176  }
177 
178  if (UnicodeString.Length)
179  {
180  RtlCopyMemory(UnicodeName->String,
181  UnicodeString.Buffer,
182  UnicodeString.Length);
183  }
184 
186  }
187 
188  if (!NT_SUCCESS(Status))
189  {
191  {
192  RootHubName->Header.UsbUserStatusCode = UsbUserBufferTooSmall;
193  }
194  else
195  {
196  RootHubName->Header.UsbUserStatusCode = UsbUserInvalidParameter;
197  }
198  }
199  else
200  {
201  RootHubName->Header.UsbUserStatusCode = UsbUserSuccess;
202  UnicodeName->Length = ResultLength + sizeof(UNICODE_NULL);
203  }
204 
205  RootHubName->Header.ActualBufferLength = sizeof(USBUSER_CONTROLLER_UNICODE_NAME) +
206  ResultLength;
207 }
208 
209 NTSTATUS
210 NTAPI
212  IN PIRP Irp,
214 {
215  PUSB_HCD_DRIVERKEY_NAME DriverKey;
216  PIO_STACK_LOCATION IoStack;
219  ULONG Length;
220  PUSBUSER_CONTROLLER_UNICODE_NAME ControllerName;
221  PUSB_UNICODE_NAME UnicodeName;
222  ULONG ActualLength;
223 
224  DPRINT("USBPORT_GetUnicodeName: ... \n");
225 
226  *Information = 0;
227  DriverKey = Irp->AssociatedIrp.SystemBuffer;
228 
230  OutputBufferLength = IoStack->Parameters.DeviceIoControl.OutputBufferLength;
231  IoControlCode = IoStack->Parameters.DeviceIoControl.IoControlCode;
232 
233  if (OutputBufferLength < sizeof(USB_UNICODE_NAME))
234  {
236  }
237 
238  Length = sizeof(USBUSER_CONTROLLER_UNICODE_NAME);
239 
240  while (TRUE)
241  {
242  ControllerName = ExAllocatePoolWithTag(PagedPool,
243  Length,
244  USB_PORT_TAG);
245 
246  if (!ControllerName)
247  {
249  }
250 
251  RtlZeroMemory(ControllerName, Length);
252 
253  ControllerName->Header.RequestBufferLength = Length;
254  UnicodeName = &ControllerName->UnicodeName;
255 
257  {
258  ControllerName->Header.UsbUserRequest = USBUSER_GET_CONTROLLER_DRIVER_KEY;
259  USBPORT_UserGetHcName(FdoDevice, ControllerName, UnicodeName);
260  }
261  else
262  {
263  ControllerName->Header.UsbUserRequest = USBUSER_GET_ROOTHUB_SYMBOLIC_NAME;
264  USBPORT_UserGetRootHubName(FdoDevice, ControllerName, UnicodeName);
265  }
266 
267  if (ControllerName->Header.UsbUserStatusCode != UsbUserBufferTooSmall)
268  {
269  break;
270  }
271 
272  Length = ControllerName->Header.ActualBufferLength;
273 
274  ExFreePoolWithTag(ControllerName, USB_PORT_TAG);
275  }
276 
277  if (ControllerName->Header.UsbUserStatusCode != UsbUserSuccess)
278  {
279  ExFreePoolWithTag(ControllerName, USB_PORT_TAG);
280  return STATUS_UNSUCCESSFUL;
281  }
282 
283  ActualLength = sizeof(ULONG) + ControllerName->UnicodeName.Length;
284 
285  DriverKey->ActualLength = ActualLength;
286 
287  if (OutputBufferLength < ActualLength)
288  {
289  DriverKey->DriverKeyName[0] = UNICODE_NULL;
290  *Information = sizeof(USB_UNICODE_NAME);
291  }
292  else
293  {
294  RtlCopyMemory(DriverKey->DriverKeyName,
295  ControllerName->UnicodeName.String,
296  ControllerName->UnicodeName.Length);
297 
298  *Information = DriverKey->ActualLength;
299  }
300 
301  ExFreePoolWithTag(ControllerName, USB_PORT_TAG);
302 
303  return STATUS_SUCCESS;
304 }
305 
306 NTSTATUS
307 NTAPI
309  IN PIRP Irp)
310 {
311  DPRINT1("USBPORT_PdoDeviceControl: UNIMPLEMENTED. FIXME. \n");
312  return 0;
313 }
314 
315 NTSTATUS
316 NTAPI
318  IN PIRP Irp)
319 {
321  PIO_STACK_LOCATION IoStack;
322  ULONG IoCtl;
324 
325  PdoExtension = PdoDevice->DeviceExtension;
327  IoCtl = IoStack->Parameters.DeviceIoControl.IoControlCode;
328 
329  //DPRINT("USBPORT_PdoInternalDeviceControl: PdoDevice - %p, Irp - %p, IoCtl - %x\n",
330  // PdoDevice,
331  // Irp,
332  // IoCtl);
333 
334  if (IoCtl == IOCTL_INTERNAL_USB_SUBMIT_URB)
335  {
336  return USBPORT_HandleSubmitURB(PdoDevice, Irp, URB_FROM_IRP(Irp));
337  }
338 
340  {
341  DPRINT("USBPORT_PdoInternalDeviceControl: IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n");
342 
343  if (IoStack->Parameters.Others.Argument1)
344  *(PVOID *)IoStack->Parameters.Others.Argument1 = PdoDevice;
345 
346  if (IoStack->Parameters.Others.Argument2)
347  *(PVOID *)IoStack->Parameters.Others.Argument2 = PdoDevice;
348 
350  goto Exit;
351  }
352 
354  {
355  DPRINT("USBPORT_PdoInternalDeviceControl: IOCTL_INTERNAL_USB_GET_HUB_COUNT\n");
356 
357  if (IoStack->Parameters.Others.Argument1)
358  {
359  ++*(PULONG)IoStack->Parameters.Others.Argument1;
360  }
361 
363  goto Exit;
364  }
365 
366  if (IoCtl == IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE)
367  {
368  DPRINT("USBPORT_PdoInternalDeviceControl: IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE\n");
369 
370  if (IoStack->Parameters.Others.Argument1)
371  {
372  *(PVOID *)IoStack->Parameters.Others.Argument1 = &PdoExtension->DeviceHandle;
373  }
374 
376  goto Exit;
377  }
378 
379  if (IoCtl == IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION)
380  {
381  DPRINT("USBPORT_PdoInternalDeviceControl: IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n");
382  return USBPORT_IdleNotification(PdoDevice, Irp);
383  }
384 
385  DPRINT("USBPORT_PdoInternalDeviceControl: INVALID INTERNAL DEVICE CONTROL\n");
387 
388 Exit:
389  Irp->IoStatus.Status = Status;
391  return Status;
392 }
393 
394 NTSTATUS
395 NTAPI
397  IN PIRP Irp)
398 {
400  PIO_STACK_LOCATION IoStack;
404 
405  DPRINT("USBPORT_FdoDeviceControl: Irp - %p\n", Irp);
406 
407  FdoExtension = FdoDevice->DeviceExtension;
408 
410  ControlCode = IoStack->Parameters.DeviceIoControl.IoControlCode;
411 
412  switch (ControlCode)
413  {
415  DPRINT("USBPORT_FdoDeviceControl: IOCTL_USB_DIAGNOSTIC_MODE_ON\n");
417  break;
418 
420  DPRINT("USBPORT_FdoDeviceControl: IOCTL_USB_DIAGNOSTIC_MODE_OFF\n");
422  break;
423 
425  DPRINT1("USBPORT_FdoDeviceControl: IOCTL_USB_GET_NODE_INFORMATION\n");
427  break;
428 
430  DPRINT1("USBPORT_FdoDeviceControl: IOCTL_GET_HCD_DRIVERKEY_NAME\n");
432  break;
433 
434  case IOCTL_USB_USER_REQUEST:
435  DPRINT1("USBPORT_FdoDeviceControl: IOCTL_USB_USER_REQUEST UNIMPLEMENTED. FIXME\n");
436  break;
437 
438  default:
439  DPRINT1("USBPORT_FdoDeviceControl: Not supported IoControlCode - %x\n",
440  ControlCode);
442  break;
443  }
444 
445  Irp->IoStatus.Status = Status;
446  Irp->IoStatus.Information = Information;
448 
449  return Status;
450 }
451 
452 NTSTATUS
453 NTAPI
455  IN PIRP Irp)
456 {
457  DPRINT1("USBPORT_FdoInternalDeviceControl: UNIMPLEMENTED. FIXME. \n");
458  return 0;
459 }
IN CINT OUT PVOID IN ULONG OUT PULONG ResultLength
Definition: conport.c:47
#define IN
Definition: typedefs.h:38
VOID NTAPI USBPORT_UserGetHcName(IN PDEVICE_OBJECT FdoDevice, IN PUSBUSER_CONTROLLER_UNICODE_NAME ControllerName, IN PUSB_UNICODE_NAME UnicodeName)
Definition: ioctl.c:15
VOID NTAPI USBPORT_UserGetRootHubName(IN PDEVICE_OBJECT FdoDevice, IN PUSBUSER_CONTROLLER_UNICODE_NAME RootHubName, IN PUSB_UNICODE_NAME UnicodeName)
Definition: ioctl.c:147
#define TRUE
Definition: types.h:120
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
#define URB_FROM_IRP(Irp)
Definition: usb.h:85
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
*BytesInUnicodeString PWCH UnicodeString
Definition: rtlfuncs.h:1980
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ ULONG IoControlCode
Definition: fltkernel.h:1383
#define IOCTL_INTERNAL_USB_SUBMIT_URB
Definition: usbioctl.h:32
FSRTL_ADVANCED_FCB_HEADER Header
Definition: cdstruc.h:931
#define IOCTL_GET_HCD_DRIVERKEY_NAME
Definition: usbioctl.h:165
_In_ PIRP Irp
Definition: csq.h:116
uint16_t * PWSTR
Definition: typedefs.h:54
LONG NTSTATUS
Definition: precomp.h:26
IN PDCB IN POEM_STRING IN PUNICODE_STRING UnicodeName
Definition: fatprocs.h:1294
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ ULONG _In_ ULONG _In_ ULONG OutputBufferLength
Definition: fltkernel.h:1374
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
NTSTATUS NTAPI USBPORT_PdoInternalDeviceControl(IN PDEVICE_OBJECT PdoDevice, IN PIRP Irp)
Definition: ioctl.c:317
NTSTATUS NTAPI USBPORT_FdoDeviceControl(IN PDEVICE_OBJECT FdoDevice, IN PIRP Irp)
Definition: ioctl.c:396
uint16_t * PWCHAR
Definition: typedefs.h:54
NTSTATUS NTAPI USBPORT_GetUnicodeName(IN PDEVICE_OBJECT FdoDevice, IN PIRP Irp, IN PULONG_PTR Information)
Definition: ioctl.c:211
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:64
uint32_t ULONG_PTR
Definition: typedefs.h:63
#define USB_PORT_TAG
Definition: usbport.h:44
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define UNICODE_NULL
#define USBPORT_FLAG_DIAGNOSTIC_MODE
Definition: usbport.h:76
NTSTATUS NTAPI USBPORT_GetSymbolicName(IN PDEVICE_OBJECT RootHubPdo, IN PUNICODE_STRING DestinationString)
Definition: ioctl.c:62
_Out_ _Inout_ POEM_STRING DestinationString
Definition: rtlfuncs.h:1869
smooth NULL
Definition: ftsmooth.c:416
#define IoCompleteRequest
Definition: irp.c:1240
NTSTATUS NTAPI IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_REGISTRY_PROPERTY DeviceProperty, IN ULONG BufferLength, OUT PVOID PropertyBuffer, OUT PULONG ResultLength)
Definition: pnpmgr.c:4210
void DPRINT(...)
Definition: polytest.cpp:61
_IRQL_requires_same_ typedef _In_ ULONG ControlCode
Definition: wmitypes.h:55
Definition: bufpool.h:45
#define IOCTL_USB_DIAGNOSTIC_MODE_OFF
Definition: usbioctl.h:150
if(!(yy_init))
Definition: macro.lex.yy.c:714
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
static void Exit(void)
Definition: sock.c:1331
#define IOCTL_INTERNAL_USB_GET_HUB_COUNT
Definition: usbioctl.h:50
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
_Out_ _Inout_ POEM_STRING _In_ PCUNICODE_STRING SourceString
Definition: rtlfuncs.h:1869
#define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO
Definition: usbioctl.h:38
static const WCHAR L[]
Definition: oid.c:1250
NTSTATUS NTAPI USBPORT_HandleSubmitURB(IN PDEVICE_OBJECT PdoDevice, IN PIRP Irp, IN PURB Urb)
Definition: urb.c:791
WCHAR DriverKeyName[ANYSIZE_ARRAY]
Definition: usbioctl.h:325
Status
Definition: gdiplustypes.h:24
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2745
ULONG_PTR SIZE_T
Definition: typedefs.h:78
NTSTATUS NTAPI USBPORT_IdleNotification(IN PDEVICE_OBJECT PdoDevice, IN PIRP Irp)
Definition: power.c:612
unsigned int * PULONG
Definition: retypes.h:1
#define DPRINT1
Definition: precomp.h:8
NTSTATUS NTAPI USBPORT_PdoDeviceControl(IN PDEVICE_OBJECT PdoDevice, IN PIRP Irp)
Definition: ioctl.c:308
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:565
NTSTATUS NTAPI USBPORT_FdoInternalDeviceControl(IN PDEVICE_OBJECT FdoDevice, IN PIRP Irp)
Definition: ioctl.c:454
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define ULONG_PTR
Definition: config.h:101
uint32_t * PULONG_PTR
Definition: typedefs.h:63
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define IOCTL_USB_DIAGNOSTIC_MODE_ON
Definition: usbioctl.h:155
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:2771
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
return STATUS_SUCCESS
Definition: btrfs.c:2777
#define IOCTL_USB_GET_NODE_INFORMATION
Definition: usbioctl.h:169
Iosb Information
Definition: create.c:4377