Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

657 lines
18 KiB

  1. /*++
  2. Copyright (c) 1995 Microsoft Corporation
  3. Module Name:
  4. USBD.H
  5. Abstract:
  6. This module contains the PRIVATE (driver-only) definitions for the
  7. code that implements the usbd driver.
  8. Environment:
  9. Kernel & user mode
  10. Revision History:
  11. 09-29-95 : created
  12. --*/
  13. #ifndef USBKDEXTS
  14. #include "dbg.h"
  15. #endif
  16. #define NAME_MAX 64
  17. #define USBD_TAG 0x44425355 /* "USBD" */
  18. #if DBG
  19. #define DEBUG_LOG
  20. #endif
  21. //enable pageable code
  22. #ifndef PAGE_CODE
  23. #define PAGE_CODE
  24. #endif
  25. #define _USBD_
  26. //
  27. // Constents used to format USB setup packets
  28. // for the default pipe
  29. //
  30. //
  31. // Values for the bmRequest field
  32. //
  33. #define USB_HOST_TO_DEVICE 0x00
  34. #define USB_DEVICE_TO_HOST 0x80
  35. #define USB_STANDARD_COMMAND 0x00
  36. #define USB_CLASS_COMMAND 0x20
  37. #define USB_VENDOR_COMMAND 0x40
  38. #define USB_COMMAND_TO_DEVICE 0x00
  39. #define USB_COMMAND_TO_INTERFACE 0x01
  40. #define USB_COMMAND_TO_ENDPOINT 0x02
  41. #define USB_COMMAND_TO_OTHER 0x03
  42. #define USBD_TAG 0x44425355 //"USBD"
  43. /* Registry Keys */
  44. // **
  45. // The following keys are specific to the instance of the
  46. // host controller -- the keys are read from the software
  47. // branch of the registry for the given PDO:
  48. //
  49. /* DWORD keys */
  50. // This key enables a set of global hacks for early or broken USB
  51. // devices -- the default value is OFF
  52. #define SUPPORT_NON_COMP_KEY L"SupportNonComp"
  53. // this key forces the stack in to daignotic mode
  54. #define DAIGNOSTIC_MODE_KEY L"DiagnosticMode"
  55. // enables specif USB device specific hacks to work around
  56. // certain busted devices.
  57. // see #define USBD_DEVHACK_
  58. #define DEVICE_HACK_KEY L"DeviceHackFlags"
  59. //**
  60. // The following keys are global to the USB stack
  61. // ie effect all HC controllers in the system:
  62. //
  63. // they are found in HKLM\System\CCS\Services\USB
  64. // BINARY keys (1 byte)
  65. // turns on hacks for the Toshiba Pseudo Hid device
  66. #define LEGACY_TOSHIBA_USB_KEY L"LegacyToshibaUSB"
  67. // forces 'fast-iso' on all ISO-out endpoints, this key
  68. // is for test purposes only
  69. #define FORCE_FAST_ISO_KEY L"ForceFastIso"
  70. // forces double buffering for all bulk-in endpoints
  71. // this key is for testing purposes only
  72. #define FORCE_DOUBLE_BUFFER_KEY L"ForceDoubleBuffer"
  73. /****/
  74. //
  75. // USB standard command values
  76. // combines bmRequest and bRequest fields
  77. // in the setup packet for standard control
  78. // transfers
  79. //
  80. #define STANDARD_COMMAND_REQUEST_MASK 0xff00
  81. #define STANDARD_COMMAND_GET_DESCRIPTOR ((USB_DEVICE_TO_HOST | \
  82. USB_COMMAND_TO_DEVICE) | \
  83. (USB_REQUEST_GET_DESCRIPTOR<<8))
  84. #define STANDARD_COMMAND_SET_DESCRIPTOR ((USB_HOST_TO_DEVICE | \
  85. USB_COMMAND_TO_DEVICE) | \
  86. (USB_REQUEST_SET_DESCRIPTOR<<8))
  87. #define STANDARD_COMMAND_GET_STATUS_ENDPOINT ((USB_DEVICE_TO_HOST | \
  88. USB_COMMAND_TO_ENDPOINT) | \
  89. (USB_REQUEST_GET_STATUS<<8))
  90. #define STANDARD_COMMAND_GET_STATUS_INTERFACE ((USB_DEVICE_TO_HOST | \
  91. USB_COMMAND_TO_INTERFACE) | \
  92. (USB_REQUEST_GET_STATUS<<8))
  93. #define STANDARD_COMMAND_GET_STATUS_DEVICE ((USB_DEVICE_TO_HOST | \
  94. USB_COMMAND_TO_DEVICE) | \
  95. (USB_REQUEST_GET_STATUS<<8))
  96. #define STANDARD_COMMAND_SET_CONFIGURATION ((USB_HOST_TO_DEVICE | \
  97. USB_COMMAND_TO_DEVICE) | \
  98. (USB_REQUEST_SET_CONFIGURATION<<8))
  99. #define STANDARD_COMMAND_SET_INTERFACE ((USB_HOST_TO_DEVICE | \
  100. USB_COMMAND_TO_INTERFACE) | \
  101. (USB_REQUEST_SET_INTERFACE<<8))
  102. #define STANDARD_COMMAND_SET_ADDRESS ((USB_HOST_TO_DEVICE | \
  103. USB_COMMAND_TO_DEVICE) | \
  104. (USB_REQUEST_SET_ADDRESS<<8))
  105. #define STANDARD_COMMAND_CLEAR_FEATURE_ENDPOINT ((USB_HOST_TO_DEVICE | \
  106. USB_COMMAND_TO_ENDPOINT) | \
  107. (USB_REQUEST_CLEAR_FEATURE<<8))
  108. //
  109. // USB class command macros
  110. //
  111. #define CLASS_COMMAND_GET_DESCRIPTOR ((USB_CLASS_COMMAND | \
  112. USB_DEVICE_TO_HOST | \
  113. USB_COMMAND_TO_DEVICE) | \
  114. (USB_REQUEST_GET_DESCRIPTOR<<8))
  115. #define CLASS_COMMAND_GET_STATUS_OTHER ((USB_CLASS_COMMAND | \
  116. USB_DEVICE_TO_HOST | \
  117. USB_COMMAND_TO_OTHER) | \
  118. (USB_REQUEST_GET_STATUS<<8))
  119. #define CLASS_COMMAND_SET_FEATURE_TO_OTHER ((USB_CLASS_COMMAND | \
  120. USB_HOST_TO_DEVICE | \
  121. USB_COMMAND_TO_OTHER) | \
  122. (USB_REQUEST_SET_FEATURE<<8))
  123. //
  124. // Macros to set transfer direction flag
  125. //
  126. #define USBD_SET_TRANSFER_DIRECTION_IN(tf) ((tf) |= USBD_TRANSFER_DIRECTION_IN)
  127. #define USBD_SET_TRANSFER_DIRECTION_OUT(tf) ((tf) &= ~USBD_TRANSFER_DIRECTION_IN)
  128. //
  129. // Flags for the URB header flags field used
  130. // by USBD
  131. //
  132. #define USBD_REQUEST_IS_TRANSFER 0x00000001
  133. #define USBD_REQUEST_MDL_ALLOCATED 0x00000002
  134. #define USBD_REQUEST_USES_DEFAULT_PIPE 0x00000004
  135. #define USBD_REQUEST_NO_DATA_PHASE 0x00000008
  136. typedef struct _USB_STANDARD_SETUP_PACKET {
  137. USHORT RequestCode;
  138. USHORT wValue;
  139. USHORT wIndex;
  140. USHORT wLength;
  141. } USB_STANDARD_SETUP_PACKET, *PUSB_STANDARD_SETUP_PACKET;
  142. //
  143. // information for each active pipe on a device
  144. //
  145. typedef struct _USBD_PIPE {
  146. ULONG Sig;
  147. USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;
  148. PVOID HcdEndpoint;
  149. ULONG MaxTransferSize;
  150. ULONG ScheduleOffset;
  151. ULONG UsbdPipeFlags;
  152. } USBD_PIPE, *PUSBD_PIPE;
  153. //
  154. // information for each active interface
  155. // for a device
  156. //
  157. typedef struct _USBD_INTERFACE {
  158. ULONG Sig;
  159. BOOLEAN HasAlternateSettings;
  160. UCHAR Pad[3];
  161. USB_INTERFACE_DESCRIPTOR InterfaceDescriptor; // copy of interface descriptor
  162. // copy of interfaceInformation structure, stores user parameters
  163. // for interface in case of failure during alt-interface selection
  164. PUSBD_INTERFACE_INFORMATION InterfaceInformation;
  165. USBD_PIPE PipeHandle[0]; // array of pipe handle structures
  166. } USBD_INTERFACE, *PUSBD_INTERFACE;
  167. //
  168. // informnation for the active configuration
  169. // on a device
  170. //
  171. typedef struct _USBD_CONFIG {
  172. ULONG Sig;
  173. PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
  174. PUSBD_INTERFACE InterfaceHandle[1]; // array of pointers to interface
  175. } USBD_CONFIG, *PUSBD_CONFIG;
  176. //
  177. // instance information for a device
  178. //
  179. typedef struct _USBD_DEVICE_DATA {
  180. ULONG Sig;
  181. USHORT DeviceAddress; // address assigned to the device
  182. UCHAR Pad[2];
  183. PUSBD_CONFIG ConfigurationHandle;
  184. // KTIMER TimeoutTimer;
  185. // KDPC TimeoutDpc;
  186. USBD_PIPE DefaultPipe;
  187. USB_DEVICE_DESCRIPTOR DeviceDescriptor; // a copy of the USB device descriptor
  188. USB_CONFIGURATION_DESCRIPTOR ConfigDescriptor;
  189. BOOLEAN LowSpeed; // TRUE if the device is low speed
  190. BOOLEAN AcceptingRequests;
  191. } USBD_DEVICE_DATA, *PUSBD_DEVICE_DATA;
  192. typedef struct _USBD_RH_DELAYED_SET_POWER_D0_WORK_ITEM {
  193. WORK_QUEUE_ITEM WorkQueueItem;
  194. struct _USBD_EXTENSION *DeviceExtension;
  195. PDEVICE_OBJECT DeviceObject;
  196. PIRP Irp;
  197. } USBD_RH_DELAYED_SET_POWER_D0_WORK_ITEM, *PUSBD_RH_DELAYED_SET_POWER_D0_WORK_ITEM;
  198. #define PIPE_CLOSED(ph) ((ph)->HcdEndpoint == NULL)
  199. #define GET_DEVICE_EXTENSION(DeviceObject) (((PUSBD_EXTENSION)(DeviceObject->DeviceExtension))->TrueDeviceExtension)
  200. //#define GET_DEVICE_EXTENSION(DeviceObject) ((PUSBD_EXTENSION)(DeviceObject->DeviceExtension))
  201. #define HCD_DEVICE_OBJECT(DeviceObject) (DeviceObject)
  202. #define DEVICE_FROM_DEVICEHANDLEROBJECT(UsbdDeviceHandle) (PUSBD_DEVICE_DATA) (UsbdDeviceHandle)
  203. #define SET_USBD_ERROR(err) ((err) | USBD_STATUS_ERROR)
  204. #define HC_URB(urb) ((PHCD_URB)(urb))
  205. //
  206. // we use a semaphore to serialize access to the configuration functions
  207. // in USBD
  208. //
  209. #define InitializeUsbDeviceMutex(de) KeInitializeSemaphore(&(de)->UsbDeviceMutex, 1, 1);
  210. #define USBD_WaitForUsbDeviceMutex(de) { USBD_KdPrint(3, ("'***WAIT dev mutex %x\n", &(de)->UsbDeviceMutex)); \
  211. KeWaitForSingleObject(&(de)->UsbDeviceMutex, \
  212. Executive,\
  213. KernelMode, \
  214. FALSE, \
  215. NULL); \
  216. }
  217. #define USBD_ReleaseUsbDeviceMutex(de) { USBD_KdPrint(3, ("'***RELEASE dev mutex %x\n", &(de)->UsbDeviceMutex));\
  218. KeReleaseSemaphore(&(de)->UsbDeviceMutex,\
  219. LOW_REALTIME_PRIORITY,\
  220. 1,\
  221. FALSE);\
  222. }
  223. //#if DBG
  224. //VOID
  225. //USBD_IoCompleteRequest(
  226. // IN PIRP Irp,
  227. // IN CCHAR PriorityBoost
  228. // );
  229. //#else
  230. #define USBD_IoCompleteRequest(a, b) IoCompleteRequest(a, b)
  231. //#endif
  232. //
  233. //Function Prototypes
  234. //
  235. #if DBG
  236. VOID
  237. USBD_Warning(
  238. PUSBD_DEVICE_DATA DeviceData,
  239. PUCHAR Message,
  240. BOOLEAN DebugBreak
  241. );
  242. #else
  243. #define USBD_Warning(x, y, z)
  244. #endif
  245. NTSTATUS
  246. USBD_Internal_Device_Control(
  247. IN PDEVICE_OBJECT DeviceObject,
  248. IN PIRP Irp,
  249. IN PUSBD_EXTENSION DeviceExtension,
  250. IN PBOOLEAN IrpIsPending
  251. );
  252. NTSTATUS
  253. USBD_SendCommand(
  254. IN PUSBD_DEVICE_DATA DeviceData,
  255. IN PDEVICE_OBJECT DeviceObject,
  256. IN USHORT RequestCode,
  257. IN USHORT WValue,
  258. IN USHORT WIndex,
  259. IN USHORT WLength,
  260. IN PVOID Buffer,
  261. IN ULONG BufferLength,
  262. OUT PULONG BytesReturned,
  263. OUT USBD_STATUS *UsbStatus
  264. );
  265. NTSTATUS
  266. USBD_CreateDevice(
  267. IN OUT PUSBD_DEVICE_DATA *DeviceData,
  268. IN PDEVICE_OBJECT DeviceObject,
  269. IN BOOLEAN DeviceIsLowSpeed,
  270. IN ULONG MaxPacketSize_Endpoint0,
  271. IN OUT PULONG NonCompliantDevice
  272. );
  273. NTSTATUS
  274. USBD_InitializeDevice(
  275. IN PUSBD_DEVICE_DATA DeviceData,
  276. IN PDEVICE_OBJECT DeviceObject,
  277. IN OUT PUSB_DEVICE_DESCRIPTOR DeviceDescriptor,
  278. IN ULONG DeviceDescriptorLength,
  279. IN OUT PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor,
  280. IN ULONG ConfigDescriptorLength
  281. );
  282. NTSTATUS
  283. USBD_ProcessURB(
  284. IN PDEVICE_OBJECT DeviceObject,
  285. IN PIRP Irp,
  286. IN PURB Urb,
  287. OUT PBOOLEAN IrpIsPending
  288. );
  289. NTSTATUS
  290. USBD_MapError_UrbToNT(
  291. IN PURB Urb,
  292. IN NTSTATUS NtStatus
  293. );
  294. NTSTATUS
  295. USBD_Irp_Complete(
  296. IN PDEVICE_OBJECT DeviceObject,
  297. IN PIRP Irp,
  298. IN PVOID Context
  299. );
  300. USHORT
  301. USBD_AllocateUsbAddress(
  302. IN PDEVICE_OBJECT DeviceObject
  303. );
  304. NTSTATUS
  305. USBD_OpenEndpoint(
  306. IN PUSBD_DEVICE_DATA Device,
  307. IN PDEVICE_OBJECT DeviceObject,
  308. IN PUSBD_PIPE PipeHandle,
  309. OUT USBD_STATUS *UsbStatus,
  310. BOOLEAN IsDefaultPipe
  311. );
  312. NTSTATUS
  313. USBD_GetDescriptor(
  314. IN PUSBD_DEVICE_DATA Device,
  315. IN PDEVICE_OBJECT DeviceObject,
  316. OUT PUCHAR DescriptorBuffer,
  317. IN USHORT DescriptorBufferLength,
  318. IN USHORT DescriptorTypeAndIndex
  319. );
  320. NTSTATUS
  321. USBD_CloseEndpoint(
  322. IN PUSBD_DEVICE_DATA Device,
  323. IN PDEVICE_OBJECT DeviceObject,
  324. IN PUSBD_PIPE PipeHandle,
  325. OUT USBD_STATUS *UsbStatus
  326. );
  327. NTSTATUS
  328. USBD_PnP(
  329. IN PDEVICE_OBJECT DeviceObject,
  330. IN PIRP Irp
  331. );
  332. VOID
  333. USBD_LogInit(
  334. );
  335. NTSTATUS
  336. USBD_SubmitSynchronousURB(
  337. IN PURB Urb,
  338. IN PDEVICE_OBJECT DeviceObject,
  339. IN PUSBD_DEVICE_DATA DeviceData
  340. );
  341. NTSTATUS
  342. USBD_EnumerateBUS(
  343. IN PDEVICE_OBJECT DeviceObject,
  344. IN PUCHAR DeviceEnumBuffer,
  345. IN ULONG DeviceEnumBufferLength
  346. );
  347. NTSTATUS
  348. USBD_InternalCloseConfiguration(
  349. IN PUSBD_DEVICE_DATA DeviceData,
  350. IN PDEVICE_OBJECT DeviceObject,
  351. IN OUT USBD_STATUS *UsbdStatus,
  352. IN BOOLEAN AbortTransfers,
  353. IN BOOLEAN KeepConfig
  354. );
  355. PUSB_INTERFACE_DESCRIPTOR
  356. USBD_InternalParseConfigurationDescriptor(
  357. IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
  358. IN UCHAR InterfaceNumber,
  359. IN UCHAR AlternateSetting,
  360. PBOOLEAN HasAlternateSettings
  361. );
  362. NTSTATUS
  363. USBD_GetPdoRegistryParameters (
  364. IN PDEVICE_OBJECT PhysicalDeviceObject,
  365. IN OUT PULONG ComplienceFlags,
  366. IN OUT PULONG DiagnosticFlags,
  367. IN OUT PULONG DeviceHackFlags
  368. );
  369. NTSTATUS
  370. USBD_GetGlobalRegistryParameters (
  371. IN PDEVICE_OBJECT PhysicalDeviceObject,
  372. IN OUT PULONG ComplienceFlags,
  373. IN OUT PULONG DiagnosticFlags,
  374. IN OUT PULONG DeviceHackFlags
  375. );
  376. NTSTATUS
  377. USBD_GetEndpointState(
  378. IN PUSBD_DEVICE_DATA DeviceData,
  379. IN PDEVICE_OBJECT DeviceObject,
  380. IN PUSBD_PIPE PipeHandle,
  381. OUT USBD_STATUS *UsbStatus,
  382. OUT PULONG EndpointState
  383. );
  384. VOID
  385. USBD_SyncUrbTimeoutDPC(
  386. IN PKDPC Dpc,
  387. IN PVOID DeferredContext,
  388. IN PVOID SystemArgument1,
  389. IN PVOID SystemArgument2
  390. );
  391. VOID
  392. USBD_FreeUsbAddress(
  393. IN PDEVICE_OBJECT DeviceObject,
  394. IN USHORT DeviceAddress
  395. );
  396. ULONG
  397. USBD_InternalGetInterfaceLength(
  398. IN PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor,
  399. IN PUCHAR End
  400. );
  401. NTSTATUS
  402. USBD_InitializeConfigurationHandle(
  403. IN PUSBD_DEVICE_DATA DeviceData,
  404. IN PDEVICE_OBJECT DeviceObject,
  405. IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
  406. IN ULONG NumberOfInterfaces,
  407. IN OUT PUSBD_CONFIG *ConfigHandle
  408. );
  409. BOOLEAN
  410. USBD_InternalInterfaceBusy(
  411. IN PUSBD_DEVICE_DATA DeviceData,
  412. IN PDEVICE_OBJECT DeviceObject,
  413. IN PUSBD_INTERFACE InterfaceHandle
  414. );
  415. NTSTATUS
  416. USBD_InternalOpenInterface(
  417. IN PUSBD_DEVICE_DATA DeviceData,
  418. IN PDEVICE_OBJECT DeviceObject,
  419. IN PUSBD_CONFIG ConfigHandle,
  420. IN OUT PUSBD_INTERFACE_INFORMATION InterfaceInformation,
  421. IN OUT PUSBD_INTERFACE *InterfaceHandle,
  422. IN BOOLEAN SendSetInterfaceCommand,
  423. IN PBOOLEAN NoBandwidth
  424. );
  425. NTSTATUS
  426. USBD_SelectConfiguration(
  427. IN PDEVICE_OBJECT DeviceObject,
  428. IN PIRP Irp,
  429. IN PURB Urb,
  430. OUT PBOOLEAN IrpIsPending
  431. );
  432. NTSTATUS
  433. USBD_SelectInterface(
  434. IN PDEVICE_OBJECT DeviceObject,
  435. IN PIRP Irp,
  436. IN PURB Urb,
  437. OUT PBOOLEAN IrpIsPending
  438. );
  439. NTSTATUS
  440. USBD_GetRegistryKeyValue(
  441. IN HANDLE Handle,
  442. IN PWCHAR KeyNameString,
  443. IN ULONG KeyNameStringLength,
  444. IN PVOID Data,
  445. IN ULONG DataLength
  446. );
  447. NTSTATUS
  448. USBD_InternalMakePdoName(
  449. IN OUT PUNICODE_STRING PdoNameUnicodeString,
  450. IN ULONG Index
  451. );
  452. NTSTATUS
  453. USBD_SymbolicLink(
  454. BOOLEAN CreateFlag,
  455. PUSBD_EXTENSION DeviceExtension
  456. );
  457. NTSTATUS
  458. USBD_PdoDispatch(
  459. PDEVICE_OBJECT DeviceObject,
  460. PIRP Irp,
  461. PUSBD_EXTENSION DeviceExtension,
  462. PBOOLEAN IrpNeedsCompletion
  463. );
  464. NTSTATUS
  465. USBD_FdoDispatch(
  466. PDEVICE_OBJECT DeviceObject,
  467. PIRP Irp,
  468. PUSBD_EXTENSION DeviceExtension,
  469. PBOOLEAN IrpNeedsCompletion
  470. );
  471. NTSTATUS
  472. USBD_DeferPoRequestCompletion(
  473. IN PDEVICE_OBJECT DeviceObject,
  474. IN UCHAR MinorFunction,
  475. IN POWER_STATE DeviceState,
  476. IN PVOID Context,
  477. IN PIO_STATUS_BLOCK IoStatus
  478. );
  479. NTSTATUS
  480. USBD_InternalRestoreConfiguration(
  481. IN PUSBD_DEVICE_DATA DeviceData,
  482. IN PDEVICE_OBJECT DeviceObject,
  483. IN PUSBD_CONFIG ConfigHandle
  484. );
  485. NTSTATUS
  486. USBD_InternalCloseDefaultPipe(
  487. IN PUSBD_DEVICE_DATA DeviceData,
  488. IN PDEVICE_OBJECT DeviceObject,
  489. IN OUT USBD_STATUS *UsbdStatus,
  490. IN BOOLEAN AbortTransfers
  491. );
  492. NTSTATUS
  493. USBD_GetHubName(
  494. PUSBD_EXTENSION DeviceExtension,
  495. PIRP Irp
  496. );
  497. NTSTATUS
  498. USBD_SetRegistryKeyValue (
  499. IN HANDLE Handle,
  500. IN PUNICODE_STRING KeyNameUnicodeString,
  501. IN PVOID Data,
  502. IN ULONG DataLength,
  503. IN ULONG KeyType
  504. );
  505. NTSTATUS
  506. USBD_SetPdoRegistryParameter (
  507. IN PDEVICE_OBJECT PhysicalDeviceObject,
  508. IN PWCHAR KeyName,
  509. IN ULONG KeyNameLength,
  510. IN PVOID Data,
  511. IN ULONG DataLength,
  512. IN ULONG KeyType,
  513. IN ULONG DevInstKeyType
  514. );
  515. NTSTATUS
  516. USBD_SubmitWaitWakeIrpToHC(
  517. IN PUSBD_EXTENSION DeviceExtension
  518. );
  519. BOOLEAN
  520. USBD_ValidatePipe(
  521. PUSBD_PIPE PipeHandle
  522. );
  523. VOID
  524. USBD_CompleteIdleNotification(
  525. IN PUSBD_EXTENSION DeviceExtension
  526. );
  527. NTSTATUS
  528. USBD_FdoSetContentId(
  529. IN PIRP irp,
  530. IN PVOID pKsProperty,
  531. IN PVOID pvData
  532. );