PageRenderTime 84ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/mingw-w64-v2.0.999/mingw/mingw-w64-headers/ddk/include/ddk/classpnp.h

#
C Header | 1221 lines | 1045 code | 175 blank | 1 comment | 40 complexity | 950f3591836959e2fc626cd8282f2995 MD5 | raw file
Possible License(s): LGPL-2.1, AGPL-1.0, LGPL-3.0, Unlicense, GPL-2.0, LGPL-2.0, BSD-3-Clause, GPL-3.0
  1. #pragma once
  2. #define _CLASS_
  3. #include <ntdddisk.h>
  4. #include <ntddcdrm.h>
  5. #include <ntddtape.h>
  6. #include <ntddscsi.h>
  7. #include <ntddstor.h>
  8. #include <stdio.h>
  9. #include <scsi.h>
  10. #define max(a,b) (((a) > (b)) ? (a) : (b))
  11. #define min(a,b) (((a) < (b)) ? (a) : (b))
  12. #define SRB_CLASS_FLAGS_LOW_PRIORITY 0x10000000
  13. #define SRB_CLASS_FLAGS_PERSISTANT 0x20000000
  14. #define SRB_CLASS_FLAGS_PAGING 0x40000000
  15. #define SRB_CLASS_FLAGS_FREE_MDL 0x80000000
  16. #define ASSERT_FDO(x) \
  17. ASSERT(((PCOMMON_DEVICE_EXTENSION) (x)->DeviceExtension)->IsFdo)
  18. #define ASSERT_PDO(x) \
  19. ASSERT(!(((PCOMMON_DEVICE_EXTENSION) (x)->DeviceExtension)->IsFdo))
  20. #define IS_CLEANUP_REQUEST(majorFunction) \
  21. ((majorFunction == IRP_MJ_CLOSE) || \
  22. (majorFunction == IRP_MJ_CLEANUP) || \
  23. (majorFunction == IRP_MJ_SHUTDOWN))
  24. #define DO_MCD(fdoExtension) \
  25. (((fdoExtension)->MediaChangeDetectionInfo != NULL) && \
  26. ((fdoExtension)->MediaChangeDetectionInfo->MediaChangeDetectionDisableCount == 0))
  27. #define IS_SCSIOP_READ(opCode) \
  28. ((opCode == SCSIOP_READ6) || \
  29. (opCode == SCSIOP_READ) || \
  30. (opCode == SCSIOP_READ12) || \
  31. (opCode == SCSIOP_READ16))
  32. #define IS_SCSIOP_WRITE(opCode) \
  33. ((opCode == SCSIOP_WRITE6) || \
  34. (opCode == SCSIOP_WRITE) || \
  35. (opCode == SCSIOP_WRITE12) || \
  36. (opCode == SCSIOP_WRITE16))
  37. #define IS_SCSIOP_READWRITE(opCode) (IS_SCSIOP_READ(opCode) || IS_SCSIOP_WRITE(opCode))
  38. #define ADJUST_FUA_FLAG(fdoExt) { \
  39. if (TEST_FLAG(fdoExt->DeviceFlags, DEV_WRITE_CACHE) && \
  40. !TEST_FLAG(fdoExt->DeviceFlags, DEV_POWER_PROTECTED) && \
  41. !TEST_FLAG(fdoExt->ScanForSpecialFlags, CLASS_SPECIAL_FUA_NOT_SUPPORTED) ) { \
  42. fdoExt->CdbForceUnitAccess = TRUE; \
  43. } else { \
  44. fdoExt->CdbForceUnitAccess = FALSE; \
  45. } \
  46. }
  47. #define FREE_POOL(_PoolPtr) \
  48. if (_PoolPtr != NULL) { \
  49. ExFreePool(_PoolPtr); \
  50. _PoolPtr = NULL; \
  51. }
  52. #ifdef POOL_TAGGING
  53. #undef ExAllocatePool
  54. #undef ExAllocatePoolWithQuota
  55. #define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'nUcS')
  56. //#define ExAllocatePool(a,b) #assert(0)
  57. #define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,'nUcS')
  58. #endif
  59. #define CLASS_TAG_AUTORUN_DISABLE 'ALcS'
  60. #define CLASS_TAG_FILE_OBJECT_EXTENSION 'FLcS'
  61. #define CLASS_TAG_MEDIA_CHANGE_DETECTION 'MLcS'
  62. #define CLASS_TAG_MOUNT 'mLcS'
  63. #define CLASS_TAG_RELEASE_QUEUE 'qLcS'
  64. #define CLASS_TAG_POWER 'WLcS'
  65. #define CLASS_TAG_WMI 'wLcS'
  66. #define CLASS_TAG_FAILURE_PREDICT 'fLcS'
  67. #define CLASS_TAG_DEVICE_CONTROL 'OIcS'
  68. #define CLASS_TAG_MODE_DATA 'oLcS'
  69. #define CLASS_TAG_MULTIPATH 'mPcS'
  70. #define MAXIMUM_RETRIES 4
  71. #define CLASS_DRIVER_EXTENSION_KEY ((PVOID) ClassInitialize)
  72. #define NO_REMOVE 0
  73. #define REMOVE_PENDING 1
  74. #define REMOVE_COMPLETE 2
  75. #define ClassAcquireRemoveLock(devobj, tag) \
  76. ClassAcquireRemoveLockEx(devobj, tag, __FILE__, __LINE__)
  77. #ifdef TRY
  78. #undef TRY
  79. #endif
  80. #ifdef LEAVE
  81. #undef LEAVE
  82. #endif
  83. #ifdef FINALLY
  84. #undef FINALLY
  85. #endif
  86. #define TRY
  87. #define LEAVE goto __tryLabel;
  88. #define FINALLY __tryLabel:
  89. #if defined DebugPrint
  90. #undef DebugPrint
  91. #endif
  92. #if DBG
  93. #define DebugPrint(x) ClassDebugPrint x
  94. #else
  95. #define DebugPrint(x)
  96. #endif
  97. #define DEBUG_BUFFER_LENGTH 256
  98. #define START_UNIT_TIMEOUT (60 * 4)
  99. #define MEDIA_CHANGE_DEFAULT_TIME 1
  100. #define MEDIA_CHANGE_TIMEOUT_TIME 300
  101. #define MAXIMUM_RETRY_FOR_SINGLE_IO_IN_100NS_UNITS 0x3b9aca00
  102. #ifdef ALLOCATE_SRB_FROM_POOL
  103. #define ClasspAllocateSrb(ext) \
  104. ExAllocatePoolWithTag(NonPagedPool, \
  105. sizeof(SCSI_REQUEST_BLOCK), \
  106. 'sBRS')
  107. #define ClasspFreeSrb(ext, srb) ExFreePool((srb));
  108. #else /* ALLOCATE_SRB_FROM_POOL */
  109. #define ClasspAllocateSrb(ext) \
  110. ExAllocateFromNPagedLookasideList( \
  111. &((ext)->CommonExtension.SrbLookasideList))
  112. #define ClasspFreeSrb(ext, srb) \
  113. ExFreeToNPagedLookasideList( \
  114. &((ext)->CommonExtension.SrbLookasideList), \
  115. (srb))
  116. #endif /* ALLOCATE_SRB_FROM_POOL */
  117. #define SET_FLAG(Flags, Bit) ((Flags) |= (Bit))
  118. #define CLEAR_FLAG(Flags, Bit) ((Flags) &= ~(Bit))
  119. #define TEST_FLAG(Flags, Bit) (((Flags) & (Bit)) != 0)
  120. #define CLASS_WORKING_SET_MAXIMUM 2048
  121. #define CLASS_INTERPRET_SENSE_INFO2_MAXIMUM_HISTORY_COUNT 30000
  122. #define CLASS_SPECIAL_DISABLE_SPIN_DOWN 0x00000001
  123. #define CLASS_SPECIAL_DISABLE_SPIN_UP 0x00000002
  124. #define CLASS_SPECIAL_NO_QUEUE_LOCK 0x00000008
  125. #define CLASS_SPECIAL_DISABLE_WRITE_CACHE 0x00000010
  126. #define CLASS_SPECIAL_CAUSE_NOT_REPORTABLE_HACK 0x00000020
  127. #if ((NTDDI_VERSION == NTDDI_WIN2KSP3) || (OSVER(NTDDI_VERSION) == NTDDI_WINXP))
  128. #define CLASS_SPECIAL_DISABLE_WRITE_CACHE_NOT_SUPPORTED 0x00000040
  129. #endif
  130. #define CLASS_SPECIAL_MODIFY_CACHE_UNSUCCESSFUL 0x00000040
  131. #define CLASS_SPECIAL_FUA_NOT_SUPPORTED 0x00000080
  132. #define CLASS_SPECIAL_VALID_MASK 0x000000FB
  133. #define CLASS_SPECIAL_RESERVED (~CLASS_SPECIAL_VALID_MASK)
  134. #define DEV_WRITE_CACHE 0x00000001
  135. #define DEV_USE_SCSI1 0x00000002
  136. #define DEV_SAFE_START_UNIT 0x00000004
  137. #define DEV_NO_12BYTE_CDB 0x00000008
  138. #define DEV_POWER_PROTECTED 0x00000010
  139. #define DEV_USE_16BYTE_CDB 0x00000020
  140. #define GUID_CLASSPNP_QUERY_REGINFOEX {0x00e34b11, 0x2444, 0x4745, {0xa5, 0x3d, 0x62, 0x01, 0x00, 0xcd, 0x82, 0xf7}}
  141. #define GUID_CLASSPNP_SENSEINFO2 {0x509a8c5f, 0x71d7, 0x48f6, {0x82, 0x1e, 0x17, 0x3c, 0x49, 0xbf, 0x2f, 0x18}}
  142. #define GUID_CLASSPNP_WORKING_SET {0x105701b0, 0x9e9b, 0x47cb, {0x97, 0x80, 0x81, 0x19, 0x8a, 0xf7, 0xb5, 0x24}}
  143. #define DEFAULT_FAILURE_PREDICTION_PERIOD 60 * 60 * 1
  144. static inline ULONG CountOfSetBitsUChar(UCHAR _X)
  145. { ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; }
  146. static inline ULONG CountOfSetBitsULong(ULONG _X)
  147. { ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; }
  148. static inline ULONG CountOfSetBitsULong32(ULONG32 _X)
  149. { ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; }
  150. static inline ULONG CountOfSetBitsULong64(ULONG64 _X)
  151. { ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; }
  152. static inline ULONG CountOfSetBitsUlongPtr(ULONG_PTR _X)
  153. { ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; }
  154. typedef enum _MEDIA_CHANGE_DETECTION_STATE {
  155. MediaUnknown,
  156. MediaPresent,
  157. MediaNotPresent,
  158. MediaUnavailable
  159. } MEDIA_CHANGE_DETECTION_STATE, *PMEDIA_CHANGE_DETECTION_STATE;
  160. typedef enum _CLASS_DEBUG_LEVEL {
  161. ClassDebugError = 0,
  162. ClassDebugWarning = 1,
  163. ClassDebugTrace = 2,
  164. ClassDebugInfo = 3,
  165. ClassDebugMediaLocks = 8,
  166. ClassDebugMCN = 9,
  167. ClassDebugDelayedRetry = 10,
  168. ClassDebugSenseInfo = 11,
  169. ClassDebugRemoveLock = 12,
  170. ClassDebugExternal4 = 13,
  171. ClassDebugExternal3 = 14,
  172. ClassDebugExternal2 = 15,
  173. ClassDebugExternal1 = 16
  174. } CLASS_DEBUG_LEVEL, *PCLASS_DEBUG_LEVEL;
  175. typedef enum {
  176. EventGeneration,
  177. DataBlockCollection
  178. } CLASSENABLEDISABLEFUNCTION;
  179. typedef enum {
  180. FailurePredictionNone = 0,
  181. FailurePredictionIoctl,
  182. FailurePredictionSmart,
  183. FailurePredictionSense
  184. } FAILURE_PREDICTION_METHOD, *PFAILURE_PREDICTION_METHOD;
  185. typedef enum {
  186. PowerDownDeviceInitial,
  187. PowerDownDeviceLocked,
  188. PowerDownDeviceStopped,
  189. PowerDownDeviceOff,
  190. PowerDownDeviceUnlocked
  191. } CLASS_POWER_DOWN_STATE;
  192. typedef enum {
  193. PowerDownDeviceInitial2,
  194. PowerDownDeviceLocked2,
  195. PowerDownDeviceFlushed2,
  196. PowerDownDeviceStopped2,
  197. PowerDownDeviceOff2,
  198. PowerDownDeviceUnlocked2
  199. } CLASS_POWER_DOWN_STATE2;
  200. typedef enum {
  201. PowerUpDeviceInitial,
  202. PowerUpDeviceLocked,
  203. PowerUpDeviceOn,
  204. PowerUpDeviceStarted,
  205. PowerUpDeviceUnlocked
  206. } CLASS_POWER_UP_STATE;
  207. struct _CLASS_INIT_DATA;
  208. typedef struct _CLASS_INIT_DATA CLASS_INIT_DATA, *PCLASS_INIT_DATA;
  209. struct _CLASS_PRIVATE_FDO_DATA;
  210. typedef struct _CLASS_PRIVATE_FDO_DATA CLASS_PRIVATE_FDO_DATA, *PCLASS_PRIVATE_FDO_DATA;
  211. struct _CLASS_PRIVATE_PDO_DATA;
  212. typedef struct _CLASS_PRIVATE_PDO_DATA CLASS_PRIVATE_PDO_DATA, *PCLASS_PRIVATE_PDO_DATA;
  213. struct _CLASS_PRIVATE_COMMON_DATA;
  214. typedef struct _CLASS_PRIVATE_COMMON_DATA CLASS_PRIVATE_COMMON_DATA, *PCLASS_PRIVATE_COMMON_DATA;
  215. struct _MEDIA_CHANGE_DETECTION_INFO;
  216. typedef struct _MEDIA_CHANGE_DETECTION_INFO MEDIA_CHANGE_DETECTION_INFO, *PMEDIA_CHANGE_DETECTION_INFO;
  217. typedef struct _DICTIONARY {
  218. ULONGLONG Signature;
  219. struct _DICTIONARY_HEADER* List;
  220. KSPIN_LOCK SpinLock;
  221. } DICTIONARY, *PDICTIONARY;
  222. typedef struct _CLASSPNP_SCAN_FOR_SPECIAL_INFO {
  223. PCHAR VendorId;
  224. PCHAR ProductId;
  225. PCHAR ProductRevision;
  226. ULONG_PTR Data;
  227. } CLASSPNP_SCAN_FOR_SPECIAL_INFO, *PCLASSPNP_SCAN_FOR_SPECIAL_INFO;
  228. typedef VOID
  229. (NTAPI *PCLASS_ERROR)(
  230. PDEVICE_OBJECT DeviceObject,
  231. PSCSI_REQUEST_BLOCK Srb,
  232. NTSTATUS *Status,
  233. BOOLEAN *Retry);
  234. typedef NTSTATUS
  235. (NTAPI *PCLASS_ADD_DEVICE)(
  236. PDRIVER_OBJECT DriverObject,
  237. PDEVICE_OBJECT Pdo);
  238. typedef NTSTATUS
  239. (NTAPI *PCLASS_POWER_DEVICE)(
  240. PDEVICE_OBJECT DeviceObject,
  241. PIRP Irp);
  242. typedef NTSTATUS
  243. (NTAPI *PCLASS_START_DEVICE)(
  244. PDEVICE_OBJECT DeviceObject);
  245. typedef NTSTATUS
  246. (NTAPI *PCLASS_STOP_DEVICE)(
  247. PDEVICE_OBJECT DeviceObject,
  248. UCHAR Type);
  249. typedef NTSTATUS
  250. (NTAPI *PCLASS_INIT_DEVICE)(
  251. PDEVICE_OBJECT DeviceObject);
  252. typedef NTSTATUS
  253. (NTAPI *PCLASS_ENUM_DEVICE)(
  254. PDEVICE_OBJECT DeviceObject);
  255. typedef NTSTATUS
  256. (NTAPI *PCLASS_READ_WRITE)(
  257. PDEVICE_OBJECT DeviceObject,
  258. PIRP Irp);
  259. typedef NTSTATUS
  260. (NTAPI *PCLASS_DEVICE_CONTROL)(
  261. PDEVICE_OBJECT DeviceObject,
  262. PIRP Irp);
  263. typedef NTSTATUS
  264. (NTAPI *PCLASS_SHUTDOWN_FLUSH)(
  265. PDEVICE_OBJECT DeviceObject,
  266. PIRP Irp);
  267. typedef NTSTATUS
  268. (NTAPI *PCLASS_CREATE_CLOSE)(
  269. PDEVICE_OBJECT DeviceObject,
  270. PIRP Irp);
  271. typedef NTSTATUS
  272. (NTAPI *PCLASS_QUERY_ID)(
  273. PDEVICE_OBJECT DeviceObject,
  274. BUS_QUERY_ID_TYPE IdType,
  275. PUNICODE_STRING IdString);
  276. typedef NTSTATUS
  277. (NTAPI *PCLASS_REMOVE_DEVICE)(
  278. PDEVICE_OBJECT DeviceObject,
  279. UCHAR Type);
  280. typedef VOID
  281. (NTAPI *PCLASS_UNLOAD)(
  282. PDRIVER_OBJECT DriverObject);
  283. typedef NTSTATUS
  284. (NTAPI *PCLASS_QUERY_PNP_CAPABILITIES)(
  285. PDEVICE_OBJECT PhysicalDeviceObject,
  286. PDEVICE_CAPABILITIES Capabilities);
  287. typedef VOID
  288. (NTAPI *PCLASS_TICK)(
  289. PDEVICE_OBJECT DeviceObject);
  290. typedef NTSTATUS
  291. (NTAPI *PCLASS_QUERY_WMI_REGINFO_EX)(
  292. PDEVICE_OBJECT DeviceObject,
  293. ULONG *RegFlags,
  294. PUNICODE_STRING Name,
  295. PUNICODE_STRING MofResouceName);
  296. typedef NTSTATUS
  297. (NTAPI *PCLASS_QUERY_WMI_REGINFO)(
  298. PDEVICE_OBJECT DeviceObject,
  299. ULONG *RegFlags,
  300. PUNICODE_STRING Name);
  301. typedef NTSTATUS
  302. (NTAPI *PCLASS_QUERY_WMI_DATABLOCK)(
  303. PDEVICE_OBJECT DeviceObject,
  304. PIRP Irp,
  305. ULONG GuidIndex,
  306. ULONG BufferAvail,
  307. PUCHAR Buffer);
  308. typedef NTSTATUS
  309. (NTAPI *PCLASS_SET_WMI_DATABLOCK)(
  310. PDEVICE_OBJECT DeviceObject,
  311. PIRP Irp,
  312. ULONG GuidIndex,
  313. ULONG BufferSize,
  314. PUCHAR Buffer);
  315. typedef NTSTATUS
  316. (NTAPI *PCLASS_SET_WMI_DATAITEM)(
  317. PDEVICE_OBJECT DeviceObject,
  318. PIRP Irp,
  319. ULONG GuidIndex,
  320. ULONG DataItemId,
  321. ULONG BufferSize,
  322. PUCHAR Buffer);
  323. typedef NTSTATUS
  324. (NTAPI *PCLASS_EXECUTE_WMI_METHOD)(
  325. PDEVICE_OBJECT DeviceObject,
  326. PIRP Irp,
  327. ULONG GuidIndex,
  328. ULONG MethodId,
  329. ULONG InBufferSize,
  330. ULONG OutBufferSize,
  331. PUCHAR Buffer);
  332. typedef NTSTATUS
  333. (NTAPI *PCLASS_WMI_FUNCTION_CONTROL)(
  334. PDEVICE_OBJECT DeviceObject,
  335. PIRP Irp,
  336. ULONG GuidIndex,
  337. CLASSENABLEDISABLEFUNCTION Function,
  338. BOOLEAN Enable);
  339. typedef struct _SRB_HISTORY_ITEM {
  340. LARGE_INTEGER TickCountSent;
  341. LARGE_INTEGER TickCountCompleted;
  342. ULONG MillisecondsDelayOnRetry;
  343. SENSE_DATA NormalizedSenseData;
  344. UCHAR SrbStatus;
  345. UCHAR ClassDriverUse;
  346. } SRB_HISTORY_ITEM, *PSRB_HISTORY_ITEM;
  347. typedef struct _SRB_HISTORY {
  348. ULONG_PTR ClassDriverUse[4];
  349. ULONG TotalHistoryCount;
  350. ULONG UsedHistoryCount;
  351. SRB_HISTORY_ITEM History[1];
  352. } SRB_HISTORY, *PSRB_HISTORY;
  353. typedef BOOLEAN
  354. (NTAPI *PCLASS_INTERPRET_SENSE_INFO)(
  355. PDEVICE_OBJECT Fdo,
  356. PIRP OriginalRequest,
  357. PSCSI_REQUEST_BLOCK Srb,
  358. UCHAR MajorFunctionCode,
  359. ULONG IoDeviceCode,
  360. ULONG PreviousRetryCount,
  361. SRB_HISTORY *RequestHistory,
  362. NTSTATUS *Status,
  363. LONGLONG *RetryIn100nsUnits);
  364. typedef VOID
  365. (NTAPI *PCLASS_COMPRESS_RETRY_HISTORY_DATA)(
  366. PDEVICE_OBJECT DeviceObject,
  367. PSRB_HISTORY RequestHistory);
  368. typedef struct {
  369. GUID Guid;
  370. ULONG InstanceCount;
  371. ULONG Flags;
  372. } GUIDREGINFO, *PGUIDREGINFO;
  373. typedef struct _CLASS_WMI_INFO {
  374. ULONG GuidCount;
  375. PGUIDREGINFO GuidRegInfo;
  376. PCLASS_QUERY_WMI_REGINFO ClassQueryWmiRegInfo;
  377. PCLASS_QUERY_WMI_DATABLOCK ClassQueryWmiDataBlock;
  378. PCLASS_SET_WMI_DATABLOCK ClassSetWmiDataBlock;
  379. PCLASS_SET_WMI_DATAITEM ClassSetWmiDataItem;
  380. PCLASS_EXECUTE_WMI_METHOD ClassExecuteWmiMethod;
  381. PCLASS_WMI_FUNCTION_CONTROL ClassWmiFunctionControl;
  382. } CLASS_WMI_INFO, *PCLASS_WMI_INFO;
  383. typedef struct _CLASS_DEV_INFO {
  384. ULONG DeviceExtensionSize;
  385. DEVICE_TYPE DeviceType;
  386. UCHAR StackSize;
  387. ULONG DeviceCharacteristics;
  388. PCLASS_ERROR ClassError;
  389. PCLASS_READ_WRITE ClassReadWriteVerification;
  390. PCLASS_DEVICE_CONTROL ClassDeviceControl;
  391. PCLASS_SHUTDOWN_FLUSH ClassShutdownFlush;
  392. PCLASS_CREATE_CLOSE ClassCreateClose;
  393. PCLASS_INIT_DEVICE ClassInitDevice;
  394. PCLASS_START_DEVICE ClassStartDevice;
  395. PCLASS_POWER_DEVICE ClassPowerDevice;
  396. PCLASS_STOP_DEVICE ClassStopDevice;
  397. PCLASS_REMOVE_DEVICE ClassRemoveDevice;
  398. PCLASS_QUERY_PNP_CAPABILITIES ClassQueryPnpCapabilities;
  399. CLASS_WMI_INFO ClassWmiInfo;
  400. } CLASS_DEV_INFO, *PCLASS_DEV_INFO;
  401. struct _CLASS_INIT_DATA {
  402. ULONG InitializationDataSize;
  403. CLASS_DEV_INFO FdoData;
  404. CLASS_DEV_INFO PdoData;
  405. PCLASS_ADD_DEVICE ClassAddDevice;
  406. PCLASS_ENUM_DEVICE ClassEnumerateDevice;
  407. PCLASS_QUERY_ID ClassQueryId;
  408. PDRIVER_STARTIO ClassStartIo;
  409. PCLASS_UNLOAD ClassUnload;
  410. PCLASS_TICK ClassTick;
  411. };
  412. typedef struct _FILE_OBJECT_EXTENSION {
  413. PFILE_OBJECT FileObject;
  414. PDEVICE_OBJECT DeviceObject;
  415. ULONG LockCount;
  416. ULONG McnDisableCount;
  417. } FILE_OBJECT_EXTENSION, *PFILE_OBJECT_EXTENSION;
  418. typedef struct _CLASS_WORKING_SET {
  419. ULONG Size;
  420. ULONG XferPacketsWorkingSetMaximum;
  421. ULONG XferPacketsWorkingSetMinimum;
  422. } CLASS_WORKING_SET, *PCLASS_WORKING_SET;
  423. typedef struct _CLASS_INTERPRET_SENSE_INFO2 {
  424. ULONG Size;
  425. ULONG HistoryCount;
  426. PCLASS_COMPRESS_RETRY_HISTORY_DATA Compress;
  427. PCLASS_INTERPRET_SENSE_INFO Interpret;
  428. } CLASS_INTERPRET_SENSE_INFO2, *PCLASS_INTERPRET_SENSE_INFO2;
  429. C_ASSERT((MAXULONG - sizeof(SRB_HISTORY)) / 30000 >= sizeof(SRB_HISTORY_ITEM));
  430. typedef struct _CLASS_DRIVER_EXTENSION {
  431. UNICODE_STRING RegistryPath;
  432. CLASS_INIT_DATA InitData;
  433. ULONG DeviceCount;
  434. #if (NTDDI_VERSION >= NTDDI_WINXP)
  435. PCLASS_QUERY_WMI_REGINFO_EX ClassFdoQueryWmiRegInfoEx;
  436. PCLASS_QUERY_WMI_REGINFO_EX ClassPdoQueryWmiRegInfoEx;
  437. #endif
  438. #if (NTDDI_VERSION >= NTDDI_VISTA)
  439. REGHANDLE EtwHandle;
  440. PDRIVER_DISPATCH DeviceMajorFunctionTable[IRP_MJ_MAXIMUM_FUNCTION + 1];
  441. PDRIVER_DISPATCH MpDeviceMajorFunctionTable[IRP_MJ_MAXIMUM_FUNCTION + 1];
  442. PCLASS_INTERPRET_SENSE_INFO2 InterpretSenseInfo;
  443. PCLASS_WORKING_SET WorkingSet;
  444. #endif
  445. } CLASS_DRIVER_EXTENSION, *PCLASS_DRIVER_EXTENSION;
  446. typedef struct _COMMON_DEVICE_EXTENSION {
  447. ULONG Version;
  448. PDEVICE_OBJECT DeviceObject;
  449. PDEVICE_OBJECT LowerDeviceObject;
  450. struct _FUNCTIONAL_DEVICE_EXTENSION *PartitionZeroExtension;
  451. PCLASS_DRIVER_EXTENSION DriverExtension;
  452. LONG RemoveLock;
  453. KEVENT RemoveEvent;
  454. KSPIN_LOCK RemoveTrackingSpinlock;
  455. PVOID RemoveTrackingList;
  456. LONG RemoveTrackingUntrackedCount;
  457. PVOID DriverData;
  458. _ANONYMOUS_STRUCT struct {
  459. BOOLEAN IsFdo:1;
  460. BOOLEAN IsInitialized:1;
  461. BOOLEAN IsSrbLookasideListInitialized:1;
  462. } DUMMYSTRUCTNAME;
  463. UCHAR PreviousState;
  464. UCHAR CurrentState;
  465. ULONG IsRemoved;
  466. UNICODE_STRING DeviceName;
  467. struct _PHYSICAL_DEVICE_EXTENSION *ChildList;
  468. ULONG PartitionNumber;
  469. LARGE_INTEGER PartitionLength;
  470. LARGE_INTEGER StartingOffset;
  471. PCLASS_DEV_INFO DevInfo;
  472. ULONG PagingPathCount;
  473. ULONG DumpPathCount;
  474. ULONG HibernationPathCount;
  475. KEVENT PathCountEvent;
  476. #ifndef ALLOCATE_SRB_FROM_POOL
  477. NPAGED_LOOKASIDE_LIST SrbLookasideList;
  478. #endif
  479. UNICODE_STRING MountedDeviceInterfaceName;
  480. ULONG GuidCount;
  481. PGUIDREGINFO GuidRegInfo;
  482. DICTIONARY FileObjectDictionary;
  483. #if (NTDDI_VERSION >= NTDDI_WINXP)
  484. PCLASS_PRIVATE_COMMON_DATA PrivateCommonData;
  485. #else
  486. ULONG_PTR Reserved1;
  487. #endif
  488. #if (NTDDI_VERSION >= NTDDI_VISTA)
  489. PDRIVER_DISPATCH *DispatchTable;
  490. #else
  491. ULONG_PTR Reserved2;
  492. #endif
  493. ULONG_PTR Reserved3;
  494. ULONG_PTR Reserved4;
  495. } COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
  496. typedef struct _PHYSICAL_DEVICE_EXTENSION {
  497. _ANONYMOUS_UNION union {
  498. _ANONYMOUS_STRUCT struct {
  499. ULONG Version;
  500. PDEVICE_OBJECT DeviceObject;
  501. } DUMMYSTRUCTNAME;
  502. COMMON_DEVICE_EXTENSION CommonExtension;
  503. } DUMMYUNIONNAME;
  504. BOOLEAN IsMissing;
  505. BOOLEAN IsEnumerated;
  506. #if (NTDDI_VERSION >= NTDDI_WINXP)
  507. PCLASS_PRIVATE_PDO_DATA PrivatePdoData;
  508. #else
  509. ULONG_PTR Reserved1;
  510. #endif
  511. ULONG_PTR Reserved2;
  512. ULONG_PTR Reserved3;
  513. ULONG_PTR Reserved4;
  514. } PHYSICAL_DEVICE_EXTENSION, *PPHYSICAL_DEVICE_EXTENSION;
  515. typedef struct _CLASS_POWER_OPTIONS {
  516. ULONG PowerDown:1;
  517. ULONG LockQueue:1;
  518. ULONG HandleSpinDown:1;
  519. ULONG HandleSpinUp:1;
  520. ULONG Reserved:27;
  521. } CLASS_POWER_OPTIONS, *PCLASS_POWER_OPTIONS;
  522. typedef struct _CLASS_POWER_CONTEXT {
  523. union {
  524. CLASS_POWER_DOWN_STATE PowerDown;
  525. CLASS_POWER_DOWN_STATE2 PowerDown2;
  526. CLASS_POWER_UP_STATE PowerUp;
  527. } PowerChangeState;
  528. CLASS_POWER_OPTIONS Options;
  529. BOOLEAN InUse;
  530. BOOLEAN QueueLocked;
  531. NTSTATUS FinalStatus;
  532. ULONG RetryCount;
  533. ULONG RetryInterval;
  534. PIO_COMPLETION_ROUTINE CompletionRoutine;
  535. PDEVICE_OBJECT DeviceObject;
  536. PIRP Irp;
  537. SCSI_REQUEST_BLOCK Srb;
  538. } CLASS_POWER_CONTEXT, *PCLASS_POWER_CONTEXT;
  539. typedef struct _COMPLETION_CONTEXT {
  540. PDEVICE_OBJECT DeviceObject;
  541. SCSI_REQUEST_BLOCK Srb;
  542. } COMPLETION_CONTEXT, *PCOMPLETION_CONTEXT;
  543. SCSIPORTAPI
  544. ULONG
  545. NTAPI
  546. ClassInitialize(
  547. PVOID Argument1,
  548. PVOID Argument2,
  549. PCLASS_INIT_DATA InitializationData);
  550. typedef struct _CLASS_QUERY_WMI_REGINFO_EX_LIST {
  551. ULONG Size;
  552. PCLASS_QUERY_WMI_REGINFO_EX ClassFdoQueryWmiRegInfoEx;
  553. PCLASS_QUERY_WMI_REGINFO_EX ClassPdoQueryWmiRegInfoEx;
  554. } CLASS_QUERY_WMI_REGINFO_EX_LIST, *PCLASS_QUERY_WMI_REGINFO_EX_LIST;
  555. typedef struct _FUNCTIONAL_DEVICE_EXTENSION {
  556. _ANONYMOUS_UNION union {
  557. _ANONYMOUS_STRUCT struct {
  558. ULONG Version;
  559. PDEVICE_OBJECT DeviceObject;
  560. } DUMMYSTRUCTNAME;
  561. COMMON_DEVICE_EXTENSION CommonExtension;
  562. } DUMMYUNIONNAME;
  563. PDEVICE_OBJECT LowerPdo;
  564. PSTORAGE_DEVICE_DESCRIPTOR DeviceDescriptor;
  565. PSTORAGE_ADAPTER_DESCRIPTOR AdapterDescriptor;
  566. DEVICE_POWER_STATE DevicePowerState;
  567. ULONG DMByteSkew;
  568. ULONG DMSkew;
  569. BOOLEAN DMActive;
  570. DISK_GEOMETRY DiskGeometry;
  571. PSENSE_DATA SenseData;
  572. ULONG TimeOutValue;
  573. ULONG DeviceNumber;
  574. ULONG SrbFlags;
  575. ULONG ErrorCount;
  576. LONG LockCount;
  577. LONG ProtectedLockCount;
  578. LONG InternalLockCount;
  579. KEVENT EjectSynchronizationEvent;
  580. USHORT DeviceFlags;
  581. UCHAR SectorShift;
  582. #if (NTDDI_VERSION >= NTDDI_VISTA)
  583. UCHAR CdbForceUnitAccess;
  584. #else
  585. UCHAR ReservedByte;
  586. #endif
  587. PMEDIA_CHANGE_DETECTION_INFO MediaChangeDetectionInfo;
  588. PKEVENT Unused1;
  589. HANDLE Unused2;
  590. FILE_OBJECT_EXTENSION KernelModeMcnContext;
  591. ULONG MediaChangeCount;
  592. HANDLE DeviceDirectory;
  593. KSPIN_LOCK ReleaseQueueSpinLock;
  594. PIRP ReleaseQueueIrp;
  595. SCSI_REQUEST_BLOCK ReleaseQueueSrb;
  596. BOOLEAN ReleaseQueueNeeded;
  597. BOOLEAN ReleaseQueueInProgress;
  598. BOOLEAN ReleaseQueueIrpFromPool;
  599. BOOLEAN FailurePredicted;
  600. ULONG FailureReason;
  601. struct _FAILURE_PREDICTION_INFO* FailurePredictionInfo;
  602. BOOLEAN PowerDownInProgress;
  603. ULONG EnumerationInterlock;
  604. KEVENT ChildLock;
  605. PKTHREAD ChildLockOwner;
  606. ULONG ChildLockAcquisitionCount;
  607. ULONG ScanForSpecialFlags;
  608. KDPC PowerRetryDpc;
  609. KTIMER PowerRetryTimer;
  610. CLASS_POWER_CONTEXT PowerContext;
  611. #if (NTDDI_VERSION <= NTDDI_WIN2K)
  612. #if (SPVER(NTDDI_VERSION) < 2))
  613. ULONG_PTR Reserved1;
  614. ULONG_PTR Reserved2;
  615. ULONG_PTR Reserved3;
  616. ULONG_PTR Reserved4;
  617. #else
  618. ULONG CompletionSuccessCount;
  619. ULONG SavedSrbFlags;
  620. ULONG SavedErrorCount;
  621. ULONG_PTR Reserved1;
  622. #endif
  623. #else /* (NTDDI_VERSION <= NTDDI_WIN2K) */
  624. PCLASS_PRIVATE_FDO_DATA PrivateFdoData;
  625. ULONG_PTR Reserved2;
  626. ULONG_PTR Reserved3;
  627. ULONG_PTR Reserved4;
  628. #endif /* (NTDDI_VERSION <= NTDDI_WIN2K) */
  629. } FUNCTIONAL_DEVICE_EXTENSION, *PFUNCTIONAL_DEVICE_EXTENSION;
  630. SCSIPORTAPI
  631. ULONG
  632. NTAPI
  633. ClassInitializeEx(
  634. PDRIVER_OBJECT DriverObject,
  635. LPGUID Guid,
  636. PVOID Data);
  637. SCSIPORTAPI
  638. NTSTATUS
  639. NTAPI
  640. ClassCreateDeviceObject(
  641. PDRIVER_OBJECT DriverObject,
  642. PCCHAR ObjectNameBuffer,
  643. PDEVICE_OBJECT LowerDeviceObject,
  644. BOOLEAN IsFdo,
  645. PDEVICE_OBJECT *DeviceObject);
  646. SCSIPORTAPI
  647. NTSTATUS
  648. NTAPI
  649. ClassReadDriveCapacity(
  650. PDEVICE_OBJECT DeviceObject);
  651. SCSIPORTAPI
  652. VOID
  653. NTAPI
  654. ClassReleaseQueue(
  655. PDEVICE_OBJECT DeviceObject);
  656. SCSIPORTAPI
  657. VOID
  658. NTAPI
  659. ClassSplitRequest(
  660. PDEVICE_OBJECT DeviceObject,
  661. PIRP Irp,
  662. ULONG MaximumBytes);
  663. SCSIPORTAPI
  664. NTSTATUS
  665. NTAPI
  666. ClassDeviceControl(
  667. PDEVICE_OBJECT DeviceObject,
  668. PIRP Irp);
  669. SCSIPORTAPI
  670. NTSTATUS
  671. NTAPI
  672. ClassIoComplete(
  673. PDEVICE_OBJECT DeviceObject,
  674. PIRP Irp,
  675. PVOID Context);
  676. SCSIPORTAPI
  677. NTSTATUS
  678. NTAPI
  679. ClassIoCompleteAssociated(
  680. PDEVICE_OBJECT DeviceObject,
  681. PIRP Irp,
  682. PVOID Context);
  683. SCSIPORTAPI
  684. BOOLEAN
  685. NTAPI
  686. ClassInterpretSenseInfo(
  687. PDEVICE_OBJECT DeviceObject,
  688. PSCSI_REQUEST_BLOCK Srb,
  689. UCHAR MajorFunctionCode,
  690. ULONG IoDeviceCode,
  691. ULONG RetryCount,
  692. NTSTATUS *Status,
  693. ULONG *RetryInterval);
  694. VOID
  695. NTAPI
  696. ClassSendDeviceIoControlSynchronous(
  697. ULONG IoControlCode,
  698. PDEVICE_OBJECT TargetDeviceObject,
  699. PVOID Buffer,
  700. ULONG InputBufferLength,
  701. ULONG OutputBufferLength,
  702. BOOLEAN InternalDeviceIoControl,
  703. PIO_STATUS_BLOCK IoStatus);
  704. SCSIPORTAPI
  705. NTSTATUS
  706. NTAPI
  707. ClassSendIrpSynchronous(
  708. PDEVICE_OBJECT TargetDeviceObject,
  709. PIRP Irp);
  710. SCSIPORTAPI
  711. NTSTATUS
  712. NTAPI
  713. ClassForwardIrpSynchronous(
  714. PCOMMON_DEVICE_EXTENSION CommonExtension,
  715. PIRP Irp);
  716. SCSIPORTAPI
  717. NTSTATUS
  718. NTAPI
  719. ClassSendSrbSynchronous(
  720. PDEVICE_OBJECT DeviceObject,
  721. PSCSI_REQUEST_BLOCK Srb,
  722. PVOID BufferAddress,
  723. ULONG BufferLength,
  724. BOOLEAN WriteToDevice);
  725. SCSIPORTAPI
  726. NTSTATUS
  727. NTAPI
  728. ClassSendSrbAsynchronous(
  729. PDEVICE_OBJECT DeviceObject,
  730. PSCSI_REQUEST_BLOCK Srb,
  731. PIRP Irp,
  732. PVOID BufferAddress,
  733. ULONG BufferLength,
  734. BOOLEAN WriteToDevice);
  735. SCSIPORTAPI
  736. NTSTATUS
  737. NTAPI
  738. ClassBuildRequest(
  739. PDEVICE_OBJECT DeviceObject,
  740. PIRP Irp);
  741. SCSIPORTAPI
  742. ULONG
  743. NTAPI
  744. ClassModeSense(
  745. PDEVICE_OBJECT DeviceObject,
  746. PCHAR ModeSenseBuffer,
  747. ULONG Length,
  748. UCHAR PageMode);
  749. SCSIPORTAPI
  750. PVOID
  751. NTAPI
  752. ClassFindModePage(
  753. PCHAR ModeSenseBuffer,
  754. ULONG Length,
  755. UCHAR PageMode,
  756. BOOLEAN Use6Byte);
  757. SCSIPORTAPI
  758. NTSTATUS
  759. NTAPI
  760. ClassClaimDevice(
  761. PDEVICE_OBJECT LowerDeviceObject,
  762. BOOLEAN Release);
  763. SCSIPORTAPI
  764. NTSTATUS
  765. NTAPI
  766. ClassInternalIoControl (
  767. PDEVICE_OBJECT DeviceObject,
  768. PIRP Irp);
  769. SCSIPORTAPI
  770. VOID
  771. NTAPI
  772. ClassInitializeSrbLookasideList(
  773. PCOMMON_DEVICE_EXTENSION CommonExtension,
  774. ULONG NumberElements);
  775. SCSIPORTAPI
  776. VOID
  777. NTAPI
  778. ClassDeleteSrbLookasideList(
  779. PCOMMON_DEVICE_EXTENSION CommonExtension);
  780. SCSIPORTAPI
  781. ULONG
  782. NTAPI
  783. ClassQueryTimeOutRegistryValue(
  784. PDEVICE_OBJECT DeviceObject);
  785. SCSIPORTAPI
  786. NTSTATUS
  787. NTAPI
  788. ClassGetDescriptor(
  789. PDEVICE_OBJECT DeviceObject,
  790. PSTORAGE_PROPERTY_ID PropertyId,
  791. PSTORAGE_DESCRIPTOR_HEADER *Descriptor);
  792. SCSIPORTAPI
  793. VOID
  794. NTAPI
  795. ClassInvalidateBusRelations(
  796. PDEVICE_OBJECT Fdo);
  797. SCSIPORTAPI
  798. VOID
  799. NTAPI
  800. ClassMarkChildrenMissing(
  801. PFUNCTIONAL_DEVICE_EXTENSION Fdo);
  802. SCSIPORTAPI
  803. BOOLEAN
  804. NTAPI
  805. ClassMarkChildMissing(
  806. PPHYSICAL_DEVICE_EXTENSION PdoExtension,
  807. BOOLEAN AcquireChildLock);
  808. SCSIPORTAPI
  809. VOID
  810. ClassDebugPrint(
  811. CLASS_DEBUG_LEVEL DebugPrintLevel,
  812. PCCHAR DebugMessage,
  813. ...);
  814. SCSIPORTAPI
  815. PCLASS_DRIVER_EXTENSION
  816. NTAPI
  817. ClassGetDriverExtension(
  818. PDRIVER_OBJECT DriverObject);
  819. SCSIPORTAPI
  820. VOID
  821. NTAPI
  822. ClassCompleteRequest(
  823. PDEVICE_OBJECT DeviceObject,
  824. PIRP Irp,
  825. CCHAR PriorityBoost);
  826. SCSIPORTAPI
  827. VOID
  828. NTAPI
  829. ClassReleaseRemoveLock(
  830. PDEVICE_OBJECT DeviceObject,
  831. PIRP Tag);
  832. SCSIPORTAPI
  833. ULONG
  834. NTAPI
  835. ClassAcquireRemoveLockEx(
  836. PDEVICE_OBJECT DeviceObject,
  837. PVOID Tag,
  838. PCSTR File,
  839. ULONG Line);
  840. SCSIPORTAPI
  841. VOID
  842. NTAPI
  843. ClassUpdateInformationInRegistry(
  844. PDEVICE_OBJECT Fdo,
  845. PCHAR DeviceName,
  846. ULONG DeviceNumber,
  847. PINQUIRYDATA InquiryData,
  848. ULONG InquiryDataLength);
  849. SCSIPORTAPI
  850. NTSTATUS
  851. NTAPI
  852. ClassWmiCompleteRequest(
  853. PDEVICE_OBJECT DeviceObject,
  854. PIRP Irp,
  855. NTSTATUS Status,
  856. ULONG BufferUsed,
  857. CCHAR PriorityBoost);
  858. SCSIPORTAPI
  859. NTSTATUS
  860. NTAPI
  861. ClassWmiFireEvent(
  862. PDEVICE_OBJECT DeviceObject,
  863. LPGUID Guid,
  864. ULONG InstanceIndex,
  865. ULONG EventDataSize,
  866. PVOID EventData);
  867. SCSIPORTAPI
  868. VOID
  869. NTAPI
  870. ClassResetMediaChangeTimer(
  871. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension);
  872. SCSIPORTAPI
  873. VOID
  874. NTAPI
  875. ClassInitializeMediaChangeDetection(
  876. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension,
  877. PUCHAR EventPrefix);
  878. SCSIPORTAPI
  879. NTSTATUS
  880. NTAPI
  881. ClassInitializeTestUnitPolling(
  882. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension,
  883. BOOLEAN AllowDriveToSleep);
  884. SCSIPORTAPI
  885. PVPB
  886. NTAPI
  887. ClassGetVpb(
  888. PDEVICE_OBJECT DeviceObject);
  889. SCSIPORTAPI
  890. NTSTATUS
  891. NTAPI
  892. ClassSpinDownPowerHandler(
  893. PDEVICE_OBJECT DeviceObject,
  894. PIRP Irp);
  895. NTSTATUS
  896. NTAPI
  897. ClassStopUnitPowerHandler(
  898. PDEVICE_OBJECT DeviceObject,
  899. PIRP Irp);
  900. NTSTATUS
  901. NTAPI
  902. ClassSetFailurePredictionPoll(
  903. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension,
  904. FAILURE_PREDICTION_METHOD FailurePredictionMethod,
  905. ULONG PollingPeriod);
  906. VOID
  907. NTAPI
  908. ClassNotifyFailurePredicted(
  909. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension,
  910. PUCHAR Buffer,
  911. ULONG BufferSize,
  912. BOOLEAN LogError,
  913. ULONG UniqueErrorValue,
  914. UCHAR PathId,
  915. UCHAR TargetId,
  916. UCHAR Lun);
  917. SCSIPORTAPI
  918. VOID
  919. NTAPI
  920. ClassAcquireChildLock(
  921. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension);
  922. SCSIPORTAPI
  923. VOID
  924. NTAPI
  925. ClassReleaseChildLock(
  926. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension);
  927. NTSTATUS
  928. NTAPI
  929. ClassSignalCompletion(
  930. PDEVICE_OBJECT DeviceObject,
  931. PIRP Irp,
  932. PKEVENT Event);
  933. VOID
  934. NTAPI
  935. ClassSendStartUnit(
  936. PDEVICE_OBJECT DeviceObject);
  937. SCSIPORTAPI
  938. NTSTATUS
  939. NTAPI
  940. ClassRemoveDevice(
  941. PDEVICE_OBJECT DeviceObject,
  942. UCHAR RemoveType);
  943. SCSIPORTAPI
  944. NTSTATUS
  945. NTAPI
  946. ClassAsynchronousCompletion(
  947. PDEVICE_OBJECT DeviceObject,
  948. PIRP Irp,
  949. PVOID Event);
  950. SCSIPORTAPI
  951. VOID
  952. NTAPI
  953. ClassCheckMediaState(
  954. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension);
  955. SCSIPORTAPI
  956. NTSTATUS
  957. NTAPI
  958. ClassCheckVerifyComplete(
  959. PDEVICE_OBJECT DeviceObject,
  960. PIRP Irp,
  961. PVOID Context);
  962. SCSIPORTAPI
  963. VOID
  964. NTAPI
  965. ClassSetMediaChangeState(
  966. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension,
  967. MEDIA_CHANGE_DETECTION_STATE State,
  968. BOOLEAN Wait);
  969. SCSIPORTAPI
  970. VOID
  971. NTAPI
  972. ClassEnableMediaChangeDetection(
  973. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension);
  974. SCSIPORTAPI
  975. VOID
  976. NTAPI
  977. ClassDisableMediaChangeDetection(
  978. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension);
  979. SCSIPORTAPI
  980. VOID
  981. NTAPI
  982. ClassCleanupMediaChangeDetection(
  983. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension);
  984. VOID
  985. NTAPI
  986. ClassGetDeviceParameter(
  987. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension,
  988. PWSTR SubkeyName,
  989. PWSTR ParameterName,
  990. PULONG ParameterValue);
  991. NTSTATUS
  992. NTAPI
  993. ClassSetDeviceParameter(
  994. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension,
  995. PWSTR SubkeyName,
  996. PWSTR ParameterName,
  997. ULONG ParameterValue);
  998. #if (NTDDI_VERSION >= NTDDI_VISTA)
  999. PFILE_OBJECT_EXTENSION
  1000. NTAPI
  1001. ClassGetFsContext(
  1002. PCOMMON_DEVICE_EXTENSION CommonExtension,
  1003. PFILE_OBJECT FileObject);
  1004. VOID
  1005. NTAPI
  1006. ClassSendNotification(
  1007. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension,
  1008. const GUID *Guid,
  1009. ULONG ExtraDataSize,
  1010. PVOID ExtraData);
  1011. #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
  1012. static __inline
  1013. BOOLEAN
  1014. PORT_ALLOCATED_SENSE(
  1015. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension,
  1016. PSCSI_REQUEST_BLOCK Srb)
  1017. {
  1018. return ((BOOLEAN)((TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_PORT_DRIVER_ALLOCSENSE) &&
  1019. TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)) &&
  1020. (Srb->SenseInfoBuffer != FdoExtension->SenseData)));
  1021. }
  1022. static __inline
  1023. VOID
  1024. FREE_PORT_ALLOCATED_SENSE_BUFFER(
  1025. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension,
  1026. PSCSI_REQUEST_BLOCK Srb)
  1027. {
  1028. ASSERT(TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_PORT_DRIVER_ALLOCSENSE));
  1029. ASSERT(TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER));
  1030. ASSERT(Srb->SenseInfoBuffer != FdoExtension->SenseData);
  1031. ExFreePool(Srb->SenseInfoBuffer);
  1032. Srb->SenseInfoBuffer = FdoExtension->SenseData;
  1033. Srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE;
  1034. CLEAR_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER);
  1035. return;
  1036. }
  1037. typedef VOID
  1038. (NTAPI *PCLASS_SCAN_FOR_SPECIAL_HANDLER)(
  1039. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension,
  1040. ULONG_PTR Data);
  1041. VOID
  1042. NTAPI
  1043. ClassScanForSpecial(
  1044. PFUNCTIONAL_DEVICE_EXTENSION FdoExtension,
  1045. CLASSPNP_SCAN_FOR_SPECIAL_INFO DeviceList[],
  1046. PCLASS_SCAN_FOR_SPECIAL_HANDLER Function);