Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenclasspnp.h
Go to the documentation of this file.
00001 00002 #pragma once 00003 00004 #define _CLASS_ 00005 00006 #include <ntdddisk.h> 00007 #include <ntddcdrm.h> 00008 #include <ntddtape.h> 00009 #include <ntddscsi.h> 00010 #include <ntddstor.h> 00011 00012 #include <stdio.h> 00013 00014 #include <scsi.h> 00015 00016 #define max(a,b) (((a) > (b)) ? (a) : (b)) 00017 #define min(a,b) (((a) < (b)) ? (a) : (b)) 00018 00019 #define SRB_CLASS_FLAGS_LOW_PRIORITY 0x10000000 00020 #define SRB_CLASS_FLAGS_PERSISTANT 0x20000000 00021 #define SRB_CLASS_FLAGS_PAGING 0x40000000 00022 #define SRB_CLASS_FLAGS_FREE_MDL 0x80000000 00023 00024 #define ASSERT_FDO(x) \ 00025 ASSERT(((PCOMMON_DEVICE_EXTENSION) (x)->DeviceExtension)->IsFdo) 00026 00027 #define ASSERT_PDO(x) \ 00028 ASSERT(!(((PCOMMON_DEVICE_EXTENSION) (x)->DeviceExtension)->IsFdo)) 00029 00030 #define IS_CLEANUP_REQUEST(majorFunction) \ 00031 ((majorFunction == IRP_MJ_CLOSE) || \ 00032 (majorFunction == IRP_MJ_CLEANUP) || \ 00033 (majorFunction == IRP_MJ_SHUTDOWN)) 00034 00035 #define DO_MCD(fdoExtension) \ 00036 (((fdoExtension)->MediaChangeDetectionInfo != NULL) && \ 00037 ((fdoExtension)->MediaChangeDetectionInfo->MediaChangeDetectionDisableCount == 0)) 00038 00039 #define IS_SCSIOP_READ(opCode) \ 00040 ((opCode == SCSIOP_READ6) || \ 00041 (opCode == SCSIOP_READ) || \ 00042 (opCode == SCSIOP_READ12) || \ 00043 (opCode == SCSIOP_READ16)) 00044 00045 #define IS_SCSIOP_WRITE(opCode) \ 00046 ((opCode == SCSIOP_WRITE6) || \ 00047 (opCode == SCSIOP_WRITE) || \ 00048 (opCode == SCSIOP_WRITE12) || \ 00049 (opCode == SCSIOP_WRITE16)) 00050 00051 #define IS_SCSIOP_READWRITE(opCode) (IS_SCSIOP_READ(opCode) || IS_SCSIOP_WRITE(opCode)) 00052 00053 #define ADJUST_FUA_FLAG(fdoExt) { \ 00054 if (TEST_FLAG(fdoExt->DeviceFlags, DEV_WRITE_CACHE) && \ 00055 !TEST_FLAG(fdoExt->DeviceFlags, DEV_POWER_PROTECTED) && \ 00056 !TEST_FLAG(fdoExt->ScanForSpecialFlags, CLASS_SPECIAL_FUA_NOT_SUPPORTED) ) { \ 00057 fdoExt->CdbForceUnitAccess = TRUE; \ 00058 } else { \ 00059 fdoExt->CdbForceUnitAccess = FALSE; \ 00060 } \ 00061 } 00062 00063 #define FREE_POOL(_PoolPtr) \ 00064 if (_PoolPtr != NULL) { \ 00065 ExFreePool(_PoolPtr); \ 00066 _PoolPtr = NULL; \ 00067 } 00068 00069 #ifdef POOL_TAGGING 00070 #undef ExAllocatePool 00071 #undef ExAllocatePoolWithQuota 00072 #define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'nUcS') 00073 //#define ExAllocatePool(a,b) #assert(0) 00074 #define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,'nUcS') 00075 #endif 00076 00077 #define CLASS_TAG_AUTORUN_DISABLE 'ALcS' 00078 #define CLASS_TAG_FILE_OBJECT_EXTENSION 'FLcS' 00079 #define CLASS_TAG_MEDIA_CHANGE_DETECTION 'MLcS' 00080 #define CLASS_TAG_MOUNT 'mLcS' 00081 #define CLASS_TAG_RELEASE_QUEUE 'qLcS' 00082 #define CLASS_TAG_POWER 'WLcS' 00083 #define CLASS_TAG_WMI 'wLcS' 00084 #define CLASS_TAG_FAILURE_PREDICT 'fLcS' 00085 #define CLASS_TAG_DEVICE_CONTROL 'OIcS' 00086 #define CLASS_TAG_MODE_DATA 'oLcS' 00087 #define CLASS_TAG_MULTIPATH 'mPcS' 00088 00089 #define MAXIMUM_RETRIES 4 00090 00091 #define CLASS_DRIVER_EXTENSION_KEY ((PVOID) ClassInitialize) 00092 00093 #define NO_REMOVE 0 00094 #define REMOVE_PENDING 1 00095 #define REMOVE_COMPLETE 2 00096 00097 #define ClassAcquireRemoveLock(devobj, tag) \ 00098 ClassAcquireRemoveLockEx(devobj, tag, __FILE__, __LINE__) 00099 00100 #ifdef TRY 00101 #undef TRY 00102 #endif 00103 #ifdef LEAVE 00104 #undef LEAVE 00105 #endif 00106 00107 #ifdef FINALLY 00108 #undef FINALLY 00109 #endif 00110 00111 #define TRY 00112 #define LEAVE goto __tryLabel; 00113 #define FINALLY __tryLabel: 00114 00115 #if defined DebugPrint 00116 #undef DebugPrint 00117 #endif 00118 00119 #if DBG 00120 #define DebugPrint(x) ClassDebugPrint x 00121 #else 00122 #define DebugPrint(x) 00123 #endif 00124 00125 #define DEBUG_BUFFER_LENGTH 256 00126 00127 #define START_UNIT_TIMEOUT (60 * 4) 00128 00129 #define MEDIA_CHANGE_DEFAULT_TIME 1 00130 #define MEDIA_CHANGE_TIMEOUT_TIME 300 00131 00132 #ifdef ALLOCATE_SRB_FROM_POOL 00133 00134 #define ClasspAllocateSrb(ext) \ 00135 ExAllocatePoolWithTag(NonPagedPool, \ 00136 sizeof(SCSI_REQUEST_BLOCK), \ 00137 'sBRS') 00138 00139 #define ClasspFreeSrb(ext, srb) ExFreePool((srb)); 00140 00141 #else /* ALLOCATE_SRB_FROM_POOL */ 00142 00143 #define ClasspAllocateSrb(ext) \ 00144 ExAllocateFromNPagedLookasideList( \ 00145 &((ext)->CommonExtension.SrbLookasideList)) 00146 00147 #define ClasspFreeSrb(ext, srb) \ 00148 ExFreeToNPagedLookasideList( \ 00149 &((ext)->CommonExtension.SrbLookasideList), \ 00150 (srb)) 00151 00152 #endif /* ALLOCATE_SRB_FROM_POOL */ 00153 00154 #define SET_FLAG(Flags, Bit) ((Flags) |= (Bit)) 00155 #define CLEAR_FLAG(Flags, Bit) ((Flags) &= ~(Bit)) 00156 #define TEST_FLAG(Flags, Bit) (((Flags) & (Bit)) != 0) 00157 00158 #define CLASS_WORKING_SET_MAXIMUM 2048 00159 00160 #define CLASS_INTERPRET_SENSE_INFO2_MAXIMUM_HISTORY_COUNT 30000 00161 00162 #define CLASS_SPECIAL_DISABLE_SPIN_DOWN 0x00000001 00163 #define CLASS_SPECIAL_DISABLE_SPIN_UP 0x00000002 00164 #define CLASS_SPECIAL_NO_QUEUE_LOCK 0x00000008 00165 #define CLASS_SPECIAL_DISABLE_WRITE_CACHE 0x00000010 00166 #define CLASS_SPECIAL_CAUSE_NOT_REPORTABLE_HACK 0x00000020 00167 #if ((NTDDI_VERSION == NTDDI_WIN2KSP3) || (OSVER(NTDDI_VERSION) == NTDDI_WINXP)) 00168 #define CLASS_SPECIAL_DISABLE_WRITE_CACHE_NOT_SUPPORTED 0x00000040 00169 #endif 00170 #define CLASS_SPECIAL_MODIFY_CACHE_UNSUCCESSFUL 0x00000040 00171 #define CLASS_SPECIAL_FUA_NOT_SUPPORTED 0x00000080 00172 #define CLASS_SPECIAL_VALID_MASK 0x000000FB 00173 #define CLASS_SPECIAL_RESERVED (~CLASS_SPECIAL_VALID_MASK) 00174 00175 #define DEV_WRITE_CACHE 0x00000001 00176 #define DEV_USE_SCSI1 0x00000002 00177 #define DEV_SAFE_START_UNIT 0x00000004 00178 #define DEV_NO_12BYTE_CDB 0x00000008 00179 #define DEV_POWER_PROTECTED 0x00000010 00180 #define DEV_USE_16BYTE_CDB 0x00000020 00181 00182 #define GUID_CLASSPNP_QUERY_REGINFOEX {0x00e34b11, 0x2444, 0x4745, {0xa5, 0x3d, 0x62, 0x01, 0x00, 0xcd, 0x82, 0xf7}} 00183 #define GUID_CLASSPNP_SENSEINFO2 {0x509a8c5f, 0x71d7, 0x48f6, {0x82, 0x1e, 0x17, 0x3c, 0x49, 0xbf, 0x2f, 0x18}} 00184 #define GUID_CLASSPNP_WORKING_SET {0x105701b0, 0x9e9b, 0x47cb, {0x97, 0x80, 0x81, 0x19, 0x8a, 0xf7, 0xb5, 0x24}} 00185 00186 #define DEFAULT_FAILURE_PREDICTION_PERIOD 60 * 60 * 1 00187 00188 #define MAXIMUM_RETRY_FOR_SINGLE_IO_IN_100NS_UNITS (0x3b9aca00) 00189 00190 static inline ULONG CountOfSetBitsUChar(UCHAR _X) 00191 { ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; } 00192 static inline ULONG CountOfSetBitsULong(ULONG _X) 00193 { ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; } 00194 static inline ULONG CountOfSetBitsULong32(ULONG32 _X) 00195 { ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; } 00196 static inline ULONG CountOfSetBitsULong64(ULONG64 _X) 00197 { ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; } 00198 static inline ULONG CountOfSetBitsUlongPtr(ULONG_PTR _X) 00199 { ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; } 00200 00201 typedef enum _MEDIA_CHANGE_DETECTION_STATE { 00202 MediaUnknown, 00203 MediaPresent, 00204 MediaNotPresent, 00205 MediaUnavailable 00206 } MEDIA_CHANGE_DETECTION_STATE, *PMEDIA_CHANGE_DETECTION_STATE; 00207 00208 typedef enum _CLASS_DEBUG_LEVEL { 00209 ClassDebugError = 0, 00210 ClassDebugWarning = 1, 00211 ClassDebugTrace = 2, 00212 ClassDebugInfo = 3, 00213 ClassDebugMediaLocks = 8, 00214 ClassDebugMCN = 9, 00215 ClassDebugDelayedRetry = 10, 00216 ClassDebugSenseInfo = 11, 00217 ClassDebugRemoveLock = 12, 00218 ClassDebugExternal4 = 13, 00219 ClassDebugExternal3 = 14, 00220 ClassDebugExternal2 = 15, 00221 ClassDebugExternal1 = 16 00222 } CLASS_DEBUG_LEVEL, *PCLASS_DEBUG_LEVEL; 00223 00224 typedef enum { 00225 EventGeneration, 00226 DataBlockCollection 00227 } CLASSENABLEDISABLEFUNCTION; 00228 00229 typedef enum { 00230 FailurePredictionNone = 0, 00231 FailurePredictionIoctl, 00232 FailurePredictionSmart, 00233 FailurePredictionSense 00234 } FAILURE_PREDICTION_METHOD, *PFAILURE_PREDICTION_METHOD; 00235 00236 typedef enum { 00237 PowerDownDeviceInitial, 00238 PowerDownDeviceLocked, 00239 PowerDownDeviceStopped, 00240 PowerDownDeviceOff, 00241 PowerDownDeviceUnlocked 00242 } CLASS_POWER_DOWN_STATE; 00243 00244 typedef enum { 00245 PowerDownDeviceInitial2, 00246 PowerDownDeviceLocked2, 00247 PowerDownDeviceFlushed2, 00248 PowerDownDeviceStopped2, 00249 PowerDownDeviceOff2, 00250 PowerDownDeviceUnlocked2 00251 } CLASS_POWER_DOWN_STATE2; 00252 00253 typedef enum { 00254 PowerUpDeviceInitial, 00255 PowerUpDeviceLocked, 00256 PowerUpDeviceOn, 00257 PowerUpDeviceStarted, 00258 PowerUpDeviceUnlocked 00259 } CLASS_POWER_UP_STATE; 00260 00261 struct _CLASS_INIT_DATA; 00262 typedef struct _CLASS_INIT_DATA CLASS_INIT_DATA, *PCLASS_INIT_DATA; 00263 00264 struct _CLASS_PRIVATE_FDO_DATA; 00265 typedef struct _CLASS_PRIVATE_FDO_DATA CLASS_PRIVATE_FDO_DATA, *PCLASS_PRIVATE_FDO_DATA; 00266 00267 struct _CLASS_PRIVATE_PDO_DATA; 00268 typedef struct _CLASS_PRIVATE_PDO_DATA CLASS_PRIVATE_PDO_DATA, *PCLASS_PRIVATE_PDO_DATA; 00269 00270 struct _CLASS_PRIVATE_COMMON_DATA; 00271 typedef struct _CLASS_PRIVATE_COMMON_DATA CLASS_PRIVATE_COMMON_DATA, *PCLASS_PRIVATE_COMMON_DATA; 00272 00273 struct _MEDIA_CHANGE_DETECTION_INFO; 00274 typedef struct _MEDIA_CHANGE_DETECTION_INFO MEDIA_CHANGE_DETECTION_INFO, *PMEDIA_CHANGE_DETECTION_INFO; 00275 00276 typedef struct _DICTIONARY { 00277 ULONGLONG Signature; 00278 struct _DICTIONARY_HEADER* List; 00279 KSPIN_LOCK SpinLock; 00280 } DICTIONARY, *PDICTIONARY; 00281 00282 typedef struct _CLASSPNP_SCAN_FOR_SPECIAL_INFO { 00283 PCHAR VendorId; 00284 PCHAR ProductId; 00285 PCHAR ProductRevision; 00286 ULONG_PTR Data; 00287 } CLASSPNP_SCAN_FOR_SPECIAL_INFO, *PCLASSPNP_SCAN_FOR_SPECIAL_INFO; 00288 00289 _IRQL_requires_max_(DISPATCH_LEVEL) 00290 typedef VOID 00291 (NTAPI *PCLASS_ERROR)( 00292 _In_ PDEVICE_OBJECT DeviceObject, 00293 _In_ PSCSI_REQUEST_BLOCK Srb, 00294 _Out_ NTSTATUS *Status, 00295 _Inout_ BOOLEAN *Retry); 00296 00297 _IRQL_requires_max_(PASSIVE_LEVEL) 00298 typedef NTSTATUS 00299 (NTAPI *PCLASS_ADD_DEVICE)( 00300 _In_ PDRIVER_OBJECT DriverObject, 00301 _In_ PDEVICE_OBJECT Pdo); 00302 00303 typedef NTSTATUS 00304 (NTAPI *PCLASS_POWER_DEVICE)( 00305 _In_ PDEVICE_OBJECT DeviceObject, 00306 _In_ PIRP Irp); 00307 00308 _IRQL_requires_max_(PASSIVE_LEVEL) 00309 typedef NTSTATUS 00310 (NTAPI *PCLASS_START_DEVICE)( 00311 _In_ PDEVICE_OBJECT DeviceObject); 00312 00313 _IRQL_requires_max_(PASSIVE_LEVEL) 00314 typedef NTSTATUS 00315 (NTAPI *PCLASS_STOP_DEVICE)( 00316 _In_ PDEVICE_OBJECT DeviceObject, 00317 _In_ UCHAR Type); 00318 00319 _IRQL_requires_max_(PASSIVE_LEVEL) 00320 typedef NTSTATUS 00321 (NTAPI *PCLASS_INIT_DEVICE)( 00322 _In_ PDEVICE_OBJECT DeviceObject); 00323 00324 _IRQL_requires_max_(PASSIVE_LEVEL) 00325 typedef NTSTATUS 00326 (NTAPI *PCLASS_ENUM_DEVICE)( 00327 _In_ PDEVICE_OBJECT DeviceObject); 00328 00329 _IRQL_requires_max_(DISPATCH_LEVEL) 00330 typedef NTSTATUS 00331 (NTAPI *PCLASS_READ_WRITE)( 00332 _In_ PDEVICE_OBJECT DeviceObject, 00333 _In_ PIRP Irp); 00334 00335 _IRQL_requires_max_(DISPATCH_LEVEL) 00336 typedef NTSTATUS 00337 (NTAPI *PCLASS_DEVICE_CONTROL)( 00338 _In_ PDEVICE_OBJECT DeviceObject, 00339 _In_ PIRP Irp); 00340 00341 _IRQL_requires_max_(DISPATCH_LEVEL) 00342 typedef NTSTATUS 00343 (NTAPI *PCLASS_SHUTDOWN_FLUSH)( 00344 _In_ PDEVICE_OBJECT DeviceObject, 00345 _In_ PIRP Irp); 00346 00347 _IRQL_requires_max_(PASSIVE_LEVEL) 00348 typedef NTSTATUS 00349 (NTAPI *PCLASS_CREATE_CLOSE)( 00350 _In_ PDEVICE_OBJECT DeviceObject, 00351 _In_ PIRP Irp); 00352 00353 _IRQL_requires_max_(PASSIVE_LEVEL) 00354 typedef NTSTATUS 00355 (NTAPI *PCLASS_QUERY_ID)( 00356 _In_ PDEVICE_OBJECT DeviceObject, 00357 _In_ BUS_QUERY_ID_TYPE IdType, 00358 _In_ PUNICODE_STRING IdString); 00359 00360 _IRQL_requires_max_(PASSIVE_LEVEL) 00361 typedef NTSTATUS 00362 (NTAPI *PCLASS_REMOVE_DEVICE)( 00363 _In_ PDEVICE_OBJECT DeviceObject, 00364 _In_ UCHAR Type); 00365 00366 _IRQL_requires_max_(PASSIVE_LEVEL) 00367 typedef VOID 00368 (NTAPI *PCLASS_UNLOAD)( 00369 _In_ PDRIVER_OBJECT DriverObject); 00370 00371 _IRQL_requires_max_(PASSIVE_LEVEL) 00372 typedef NTSTATUS 00373 (NTAPI *PCLASS_QUERY_PNP_CAPABILITIES)( 00374 _In_ PDEVICE_OBJECT PhysicalDeviceObject, 00375 _In_ PDEVICE_CAPABILITIES Capabilities); 00376 00377 _IRQL_requires_(DISPATCH_LEVEL) 00378 typedef VOID 00379 (NTAPI *PCLASS_TICK)( 00380 _In_ PDEVICE_OBJECT DeviceObject); 00381 00382 _IRQL_requires_max_(PASSIVE_LEVEL) 00383 typedef NTSTATUS 00384 (NTAPI *PCLASS_QUERY_WMI_REGINFO_EX)( 00385 _In_ PDEVICE_OBJECT DeviceObject, 00386 _Out_ ULONG *RegFlags, 00387 _Out_ PUNICODE_STRING Name, 00388 _Out_ PUNICODE_STRING MofResourceName); 00389 00390 _IRQL_requires_max_(PASSIVE_LEVEL) 00391 typedef NTSTATUS 00392 (NTAPI *PCLASS_QUERY_WMI_REGINFO)( 00393 _In_ PDEVICE_OBJECT DeviceObject, 00394 _Out_ ULONG *RegFlags, 00395 _Out_ PUNICODE_STRING Name); 00396 00397 _IRQL_requires_max_(PASSIVE_LEVEL) 00398 typedef NTSTATUS 00399 (NTAPI *PCLASS_QUERY_WMI_DATABLOCK)( 00400 _In_ PDEVICE_OBJECT DeviceObject, 00401 _In_ PIRP Irp, 00402 _In_ ULONG GuidIndex, 00403 _In_ ULONG BufferAvail, 00404 _Out_writes_bytes_(BufferAvail) PUCHAR Buffer); 00405 00406 _IRQL_requires_max_(PASSIVE_LEVEL) 00407 typedef NTSTATUS 00408 (NTAPI *PCLASS_SET_WMI_DATABLOCK)( 00409 _In_ PDEVICE_OBJECT DeviceObject, 00410 _In_ PIRP Irp, 00411 _In_ ULONG GuidIndex, 00412 _In_ ULONG BufferSize, 00413 _In_reads_bytes_(BufferSize) PUCHAR Buffer); 00414 00415 _IRQL_requires_max_(PASSIVE_LEVEL) 00416 typedef NTSTATUS 00417 (NTAPI *PCLASS_SET_WMI_DATAITEM)( 00418 _In_ PDEVICE_OBJECT DeviceObject, 00419 _In_ PIRP Irp, 00420 _In_ ULONG GuidIndex, 00421 _In_ ULONG DataItemId, 00422 _In_ ULONG BufferSize, 00423 _In_reads_bytes_(BufferSize) PUCHAR Buffer); 00424 00425 _IRQL_requires_max_(PASSIVE_LEVEL) 00426 typedef NTSTATUS 00427 (NTAPI *PCLASS_EXECUTE_WMI_METHOD)( 00428 _In_ PDEVICE_OBJECT DeviceObject, 00429 _In_ PIRP Irp, 00430 _In_ ULONG GuidIndex, 00431 _In_ ULONG MethodId, 00432 _In_ ULONG InBufferSize, 00433 _In_ ULONG OutBufferSize, 00434 _In_reads_(_Inexpressible_(max(InBufferSize, OutBufferSize))) PUCHAR Buffer); 00435 00436 _IRQL_requires_max_(PASSIVE_LEVEL) 00437 typedef NTSTATUS 00438 (NTAPI *PCLASS_WMI_FUNCTION_CONTROL)( 00439 _In_ PDEVICE_OBJECT DeviceObject, 00440 _In_ PIRP Irp, 00441 _In_ ULONG GuidIndex, 00442 _In_ CLASSENABLEDISABLEFUNCTION Function, 00443 _In_ BOOLEAN Enable); 00444 00445 typedef struct _SRB_HISTORY_ITEM { 00446 LARGE_INTEGER TickCountSent; 00447 LARGE_INTEGER TickCountCompleted; 00448 ULONG MillisecondsDelayOnRetry; 00449 SENSE_DATA NormalizedSenseData; 00450 UCHAR SrbStatus; 00451 UCHAR ClassDriverUse; 00452 } SRB_HISTORY_ITEM, *PSRB_HISTORY_ITEM; 00453 00454 typedef struct _SRB_HISTORY { 00455 ULONG_PTR ClassDriverUse[4]; 00456 _Field_range_(1,30000) ULONG TotalHistoryCount; 00457 _Field_range_(0,TotalHistoryCount) ULONG UsedHistoryCount; 00458 _Field_size_part_(TotalHistoryCount, UsedHistoryCount) SRB_HISTORY_ITEM History[1]; 00459 } SRB_HISTORY, *PSRB_HISTORY; 00460 00461 _IRQL_requires_max_(DISPATCH_LEVEL) 00462 typedef BOOLEAN 00463 (NTAPI *PCLASS_INTERPRET_SENSE_INFO)( 00464 _In_ PDEVICE_OBJECT Fdo, 00465 _In_opt_ PIRP OriginalRequest, 00466 _In_ PSCSI_REQUEST_BLOCK Srb, 00467 _In_ UCHAR MajorFunctionCode, 00468 _In_ ULONG IoDeviceCode, 00469 _In_ ULONG PreviousRetryCount, 00470 _In_opt_ SRB_HISTORY *RequestHistory, 00471 _Out_ NTSTATUS *Status, 00472 _Out_ _Deref_out_range_(0,MAXIMUM_RETRY_FOR_SINGLE_IO_IN_100NS_UNITS) 00473 LONGLONG *RetryIn100nsUnits); 00474 00475 _IRQL_requires_max_(DISPATCH_LEVEL) 00476 _At_(RequestHistory->UsedHistoryCount, _Pre_equal_to_(RequestHistory->TotalHistoryCount) 00477 _Out_range_(0, RequestHistory->TotalHistoryCount - 1)) 00478 typedef VOID 00479 (NTAPI *PCLASS_COMPRESS_RETRY_HISTORY_DATA)( 00480 _In_ PDEVICE_OBJECT DeviceObject, 00481 _Inout_ PSRB_HISTORY RequestHistory); 00482 00483 typedef struct { 00484 GUID Guid; 00485 ULONG InstanceCount; 00486 ULONG Flags; 00487 } GUIDREGINFO, *PGUIDREGINFO; 00488 00489 typedef struct _CLASS_WMI_INFO { 00490 ULONG GuidCount; 00491 PGUIDREGINFO GuidRegInfo; 00492 PCLASS_QUERY_WMI_REGINFO ClassQueryWmiRegInfo; 00493 PCLASS_QUERY_WMI_DATABLOCK ClassQueryWmiDataBlock; 00494 PCLASS_SET_WMI_DATABLOCK ClassSetWmiDataBlock; 00495 PCLASS_SET_WMI_DATAITEM ClassSetWmiDataItem; 00496 PCLASS_EXECUTE_WMI_METHOD ClassExecuteWmiMethod; 00497 PCLASS_WMI_FUNCTION_CONTROL ClassWmiFunctionControl; 00498 } CLASS_WMI_INFO, *PCLASS_WMI_INFO; 00499 00500 typedef struct _CLASS_DEV_INFO { 00501 ULONG DeviceExtensionSize; 00502 DEVICE_TYPE DeviceType; 00503 UCHAR StackSize; 00504 ULONG DeviceCharacteristics; 00505 PCLASS_ERROR ClassError; 00506 PCLASS_READ_WRITE ClassReadWriteVerification; 00507 PCLASS_DEVICE_CONTROL ClassDeviceControl; 00508 PCLASS_SHUTDOWN_FLUSH ClassShutdownFlush; 00509 PCLASS_CREATE_CLOSE ClassCreateClose; 00510 PCLASS_INIT_DEVICE ClassInitDevice; 00511 PCLASS_START_DEVICE ClassStartDevice; 00512 PCLASS_POWER_DEVICE ClassPowerDevice; 00513 PCLASS_STOP_DEVICE ClassStopDevice; 00514 PCLASS_REMOVE_DEVICE ClassRemoveDevice; 00515 PCLASS_QUERY_PNP_CAPABILITIES ClassQueryPnpCapabilities; 00516 CLASS_WMI_INFO ClassWmiInfo; 00517 } CLASS_DEV_INFO, *PCLASS_DEV_INFO; 00518 00519 struct _CLASS_INIT_DATA { 00520 ULONG InitializationDataSize; 00521 CLASS_DEV_INFO FdoData; 00522 CLASS_DEV_INFO PdoData; 00523 PCLASS_ADD_DEVICE ClassAddDevice; 00524 PCLASS_ENUM_DEVICE ClassEnumerateDevice; 00525 PCLASS_QUERY_ID ClassQueryId; 00526 PDRIVER_STARTIO ClassStartIo; 00527 PCLASS_UNLOAD ClassUnload; 00528 PCLASS_TICK ClassTick; 00529 }; 00530 00531 typedef struct _FILE_OBJECT_EXTENSION { 00532 PFILE_OBJECT FileObject; 00533 PDEVICE_OBJECT DeviceObject; 00534 ULONG LockCount; 00535 ULONG McnDisableCount; 00536 } FILE_OBJECT_EXTENSION, *PFILE_OBJECT_EXTENSION; 00537 00538 typedef struct _CLASS_WORKING_SET { 00539 _Field_range_(sizeof(CLASS_WORKING_SET),sizeof(CLASS_WORKING_SET)) ULONG Size; 00540 _Field_range_(0,2048) ULONG XferPacketsWorkingSetMaximum; 00541 _Field_range_(0,2048) ULONG XferPacketsWorkingSetMinimum; 00542 } CLASS_WORKING_SET, *PCLASS_WORKING_SET; 00543 00544 typedef struct _CLASS_INTERPRET_SENSE_INFO2 { 00545 _Field_range_(sizeof(CLASS_INTERPRET_SENSE_INFO),sizeof(CLASS_INTERPRET_SENSE_INFO)) 00546 ULONG Size; 00547 _Field_range_(1,30000) ULONG HistoryCount; 00548 __callback PCLASS_COMPRESS_RETRY_HISTORY_DATA Compress; 00549 __callback PCLASS_INTERPRET_SENSE_INFO Interpret; 00550 } CLASS_INTERPRET_SENSE_INFO2, *PCLASS_INTERPRET_SENSE_INFO2; 00551 00552 C_ASSERT((MAXULONG - sizeof(SRB_HISTORY)) / 30000 >= sizeof(SRB_HISTORY_ITEM)); 00553 00554 typedef struct _CLASS_DRIVER_EXTENSION { 00555 UNICODE_STRING RegistryPath; 00556 CLASS_INIT_DATA InitData; 00557 ULONG DeviceCount; 00558 #if (NTDDI_VERSION >= NTDDI_WINXP) 00559 PCLASS_QUERY_WMI_REGINFO_EX ClassFdoQueryWmiRegInfoEx; 00560 PCLASS_QUERY_WMI_REGINFO_EX ClassPdoQueryWmiRegInfoEx; 00561 #endif 00562 #if (NTDDI_VERSION >= NTDDI_VISTA) 00563 REGHANDLE EtwHandle; 00564 PDRIVER_DISPATCH DeviceMajorFunctionTable[IRP_MJ_MAXIMUM_FUNCTION + 1]; 00565 PDRIVER_DISPATCH MpDeviceMajorFunctionTable[IRP_MJ_MAXIMUM_FUNCTION + 1]; 00566 PCLASS_INTERPRET_SENSE_INFO2 InterpretSenseInfo; 00567 PCLASS_WORKING_SET WorkingSet; 00568 #endif 00569 } CLASS_DRIVER_EXTENSION, *PCLASS_DRIVER_EXTENSION; 00570 00571 typedef struct _COMMON_DEVICE_EXTENSION { 00572 ULONG Version; 00573 PDEVICE_OBJECT DeviceObject; 00574 PDEVICE_OBJECT LowerDeviceObject; 00575 struct _FUNCTIONAL_DEVICE_EXTENSION *PartitionZeroExtension; 00576 PCLASS_DRIVER_EXTENSION DriverExtension; 00577 LONG RemoveLock; 00578 KEVENT RemoveEvent; 00579 KSPIN_LOCK RemoveTrackingSpinlock; 00580 PVOID RemoveTrackingList; 00581 LONG RemoveTrackingUntrackedCount; 00582 PVOID DriverData; 00583 _ANONYMOUS_STRUCT struct { 00584 BOOLEAN IsFdo:1; 00585 BOOLEAN IsInitialized:1; 00586 BOOLEAN IsSrbLookasideListInitialized:1; 00587 } DUMMYSTRUCTNAME; 00588 UCHAR PreviousState; 00589 UCHAR CurrentState; 00590 ULONG IsRemoved; 00591 UNICODE_STRING DeviceName; 00592 struct _PHYSICAL_DEVICE_EXTENSION *ChildList; 00593 ULONG PartitionNumber; 00594 LARGE_INTEGER PartitionLength; 00595 LARGE_INTEGER StartingOffset; 00596 PCLASS_DEV_INFO DevInfo; 00597 ULONG PagingPathCount; 00598 ULONG DumpPathCount; 00599 ULONG HibernationPathCount; 00600 KEVENT PathCountEvent; 00601 #ifndef ALLOCATE_SRB_FROM_POOL 00602 NPAGED_LOOKASIDE_LIST SrbLookasideList; 00603 #endif 00604 UNICODE_STRING MountedDeviceInterfaceName; 00605 ULONG GuidCount; 00606 PGUIDREGINFO GuidRegInfo; 00607 DICTIONARY FileObjectDictionary; 00608 #if (NTDDI_VERSION >= NTDDI_WINXP) 00609 PCLASS_PRIVATE_COMMON_DATA PrivateCommonData; 00610 #else 00611 ULONG_PTR Reserved1; 00612 #endif 00613 #if (NTDDI_VERSION >= NTDDI_VISTA) 00614 PDRIVER_DISPATCH *DispatchTable; 00615 #else 00616 ULONG_PTR Reserved2; 00617 #endif 00618 ULONG_PTR Reserved3; 00619 ULONG_PTR Reserved4; 00620 } COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION; 00621 00622 typedef struct _PHYSICAL_DEVICE_EXTENSION { 00623 _ANONYMOUS_UNION union { 00624 _ANONYMOUS_STRUCT struct { 00625 ULONG Version; 00626 PDEVICE_OBJECT DeviceObject; 00627 } DUMMYSTRUCTNAME; 00628 COMMON_DEVICE_EXTENSION CommonExtension; 00629 } DUMMYUNIONNAME; 00630 BOOLEAN IsMissing; 00631 BOOLEAN IsEnumerated; 00632 #if (NTDDI_VERSION >= NTDDI_WINXP) 00633 PCLASS_PRIVATE_PDO_DATA PrivatePdoData; 00634 #else 00635 ULONG_PTR Reserved1; 00636 #endif 00637 ULONG_PTR Reserved2; 00638 ULONG_PTR Reserved3; 00639 ULONG_PTR Reserved4; 00640 } PHYSICAL_DEVICE_EXTENSION, *PPHYSICAL_DEVICE_EXTENSION; 00641 00642 typedef struct _CLASS_POWER_OPTIONS { 00643 ULONG PowerDown:1; 00644 ULONG LockQueue:1; 00645 ULONG HandleSpinDown:1; 00646 ULONG HandleSpinUp:1; 00647 ULONG Reserved:27; 00648 } CLASS_POWER_OPTIONS, *PCLASS_POWER_OPTIONS; 00649 00650 typedef struct _CLASS_POWER_CONTEXT { 00651 union { 00652 CLASS_POWER_DOWN_STATE PowerDown; 00653 CLASS_POWER_DOWN_STATE2 PowerDown2; 00654 CLASS_POWER_UP_STATE PowerUp; 00655 } PowerChangeState; 00656 CLASS_POWER_OPTIONS Options; 00657 BOOLEAN InUse; 00658 BOOLEAN QueueLocked; 00659 NTSTATUS FinalStatus; 00660 ULONG RetryCount; 00661 ULONG RetryInterval; 00662 PIO_COMPLETION_ROUTINE CompletionRoutine; 00663 PDEVICE_OBJECT DeviceObject; 00664 PIRP Irp; 00665 SCSI_REQUEST_BLOCK Srb; 00666 } CLASS_POWER_CONTEXT, *PCLASS_POWER_CONTEXT; 00667 00668 typedef struct _COMPLETION_CONTEXT { 00669 PDEVICE_OBJECT DeviceObject; 00670 SCSI_REQUEST_BLOCK Srb; 00671 } COMPLETION_CONTEXT, *PCOMPLETION_CONTEXT; 00672 00673 _IRQL_requires_max_(PASSIVE_LEVEL) 00674 _Must_inspect_result_ 00675 SCSIPORTAPI 00676 ULONG 00677 NTAPI 00678 ClassInitialize( 00679 _In_ PVOID Argument1, 00680 _In_ PVOID Argument2, 00681 _In_ PCLASS_INIT_DATA InitializationData); 00682 00683 typedef struct _CLASS_QUERY_WMI_REGINFO_EX_LIST { 00684 ULONG Size; 00685 __callback PCLASS_QUERY_WMI_REGINFO_EX ClassFdoQueryWmiRegInfoEx; 00686 __callback PCLASS_QUERY_WMI_REGINFO_EX ClassPdoQueryWmiRegInfoEx; 00687 } CLASS_QUERY_WMI_REGINFO_EX_LIST, *PCLASS_QUERY_WMI_REGINFO_EX_LIST; 00688 00689 typedef struct _FUNCTIONAL_DEVICE_EXTENSION { 00690 _ANONYMOUS_UNION union { 00691 _ANONYMOUS_STRUCT struct { 00692 ULONG Version; 00693 PDEVICE_OBJECT DeviceObject; 00694 } DUMMYSTRUCTNAME; 00695 COMMON_DEVICE_EXTENSION CommonExtension; 00696 } DUMMYUNIONNAME; 00697 PDEVICE_OBJECT LowerPdo; 00698 PSTORAGE_DEVICE_DESCRIPTOR DeviceDescriptor; 00699 PSTORAGE_ADAPTER_DESCRIPTOR AdapterDescriptor; 00700 DEVICE_POWER_STATE DevicePowerState; 00701 ULONG DMByteSkew; 00702 ULONG DMSkew; 00703 BOOLEAN DMActive; 00704 DISK_GEOMETRY DiskGeometry; 00705 PSENSE_DATA SenseData; 00706 ULONG TimeOutValue; 00707 ULONG DeviceNumber; 00708 ULONG SrbFlags; 00709 ULONG ErrorCount; 00710 LONG LockCount; 00711 LONG ProtectedLockCount; 00712 LONG InternalLockCount; 00713 KEVENT EjectSynchronizationEvent; 00714 USHORT DeviceFlags; 00715 UCHAR SectorShift; 00716 #if (NTDDI_VERSION >= NTDDI_VISTA) 00717 UCHAR CdbForceUnitAccess; 00718 #else 00719 UCHAR ReservedByte; 00720 #endif 00721 PMEDIA_CHANGE_DETECTION_INFO MediaChangeDetectionInfo; 00722 PKEVENT Unused1; 00723 HANDLE Unused2; 00724 FILE_OBJECT_EXTENSION KernelModeMcnContext; 00725 ULONG MediaChangeCount; 00726 HANDLE DeviceDirectory; 00727 KSPIN_LOCK ReleaseQueueSpinLock; 00728 PIRP ReleaseQueueIrp; 00729 SCSI_REQUEST_BLOCK ReleaseQueueSrb; 00730 BOOLEAN ReleaseQueueNeeded; 00731 BOOLEAN ReleaseQueueInProgress; 00732 BOOLEAN ReleaseQueueIrpFromPool; 00733 BOOLEAN FailurePredicted; 00734 ULONG FailureReason; 00735 struct _FAILURE_PREDICTION_INFO* FailurePredictionInfo; 00736 BOOLEAN PowerDownInProgress; 00737 ULONG EnumerationInterlock; 00738 KEVENT ChildLock; 00739 PKTHREAD ChildLockOwner; 00740 ULONG ChildLockAcquisitionCount; 00741 ULONG ScanForSpecialFlags; 00742 KDPC PowerRetryDpc; 00743 KTIMER PowerRetryTimer; 00744 CLASS_POWER_CONTEXT PowerContext; 00745 00746 #if (NTDDI_VERSION <= NTDDI_WIN2K) 00747 00748 #if (SPVER(NTDDI_VERSION) < 2)) 00749 ULONG_PTR Reserved1; 00750 ULONG_PTR Reserved2; 00751 ULONG_PTR Reserved3; 00752 ULONG_PTR Reserved4; 00753 #else 00754 ULONG CompletionSuccessCount; 00755 ULONG SavedSrbFlags; 00756 ULONG SavedErrorCount; 00757 ULONG_PTR Reserved1; 00758 #endif 00759 00760 #else /* (NTDDI_VERSION <= NTDDI_WIN2K) */ 00761 00762 PCLASS_PRIVATE_FDO_DATA PrivateFdoData; 00763 ULONG_PTR Reserved2; 00764 ULONG_PTR Reserved3; 00765 ULONG_PTR Reserved4; 00766 00767 #endif /* (NTDDI_VERSION <= NTDDI_WIN2K) */ 00768 00769 } FUNCTIONAL_DEVICE_EXTENSION, *PFUNCTIONAL_DEVICE_EXTENSION; 00770 00771 _IRQL_requires_max_(PASSIVE_LEVEL) 00772 _Must_inspect_result_ 00773 SCSIPORTAPI 00774 ULONG 00775 NTAPI 00776 ClassInitializeEx( 00777 _In_ PDRIVER_OBJECT DriverObject, 00778 _In_ LPGUID Guid, 00779 _In_ PVOID Data); 00780 00781 _IRQL_requires_max_(PASSIVE_LEVEL) 00782 _Must_inspect_result_ 00783 _Post_satisfies_(return <= 0) 00784 SCSIPORTAPI 00785 NTSTATUS 00786 NTAPI 00787 ClassCreateDeviceObject( 00788 _In_ PDRIVER_OBJECT DriverObject, 00789 _In_z_ PCCHAR ObjectNameBuffer, 00790 _In_ PDEVICE_OBJECT LowerDeviceObject, 00791 _In_ BOOLEAN IsFdo, 00792 _Outptr_result_nullonfailure_ _At_(*DeviceObject, __drv_allocatesMem(Mem) __drv_aliasesMem) 00793 PDEVICE_OBJECT *DeviceObject); 00794 00795 _Must_inspect_result_ 00796 SCSIPORTAPI 00797 NTSTATUS 00798 NTAPI 00799 ClassReadDriveCapacity( 00800 _In_ PDEVICE_OBJECT DeviceObject); 00801 00802 SCSIPORTAPI 00803 VOID 00804 NTAPI 00805 ClassReleaseQueue( 00806 _In_ PDEVICE_OBJECT DeviceObject); 00807 00808 SCSIPORTAPI 00809 VOID 00810 NTAPI 00811 ClassSplitRequest( 00812 _In_ PDEVICE_OBJECT DeviceObject, 00813 _In_ PIRP Irp, 00814 _In_ ULONG MaximumBytes); 00815 00816 SCSIPORTAPI 00817 NTSTATUS 00818 NTAPI 00819 ClassDeviceControl( 00820 _In_ PDEVICE_OBJECT DeviceObject, 00821 _Inout_ PIRP Irp); 00822 00823 SCSIPORTAPI 00824 NTSTATUS 00825 NTAPI 00826 ClassIoComplete( 00827 PDEVICE_OBJECT DeviceObject, 00828 PIRP Irp, 00829 PVOID Context); 00830 00831 SCSIPORTAPI 00832 NTSTATUS 00833 NTAPI 00834 ClassIoCompleteAssociated( 00835 PDEVICE_OBJECT DeviceObject, 00836 PIRP Irp, 00837 PVOID Context); 00838 00839 SCSIPORTAPI 00840 BOOLEAN 00841 NTAPI 00842 ClassInterpretSenseInfo( 00843 _In_ PDEVICE_OBJECT DeviceObject, 00844 _In_ PSCSI_REQUEST_BLOCK Srb, 00845 _In_ UCHAR MajorFunctionCode, 00846 _In_ ULONG IoDeviceCode, 00847 _In_ ULONG RetryCount, 00848 _Out_ NTSTATUS *Status, 00849 _Out_opt_ _Deref_out_range_(0,100) ULONG *RetryInterval); 00850 00851 VOID 00852 NTAPI 00853 ClassSendDeviceIoControlSynchronous( 00854 _In_ ULONG IoControlCode, 00855 _In_ PDEVICE_OBJECT TargetDeviceObject, 00856 _Inout_updates_opt_(_Inexpressible_(max(InputBufferLength, OutputBufferLength))) 00857 PVOID Buffer, 00858 _In_ ULONG InputBufferLength, 00859 _In_ ULONG OutputBufferLength, 00860 _In_ BOOLEAN InternalDeviceIoControl, 00861 _Out_ PIO_STATUS_BLOCK IoStatus); 00862 00863 SCSIPORTAPI 00864 NTSTATUS 00865 NTAPI 00866 ClassSendIrpSynchronous( 00867 _In_ PDEVICE_OBJECT TargetDeviceObject, 00868 _In_ PIRP Irp); 00869 00870 SCSIPORTAPI 00871 NTSTATUS 00872 NTAPI 00873 ClassForwardIrpSynchronous( 00874 _In_ PCOMMON_DEVICE_EXTENSION CommonExtension, 00875 _In_ PIRP Irp); 00876 00877 SCSIPORTAPI 00878 NTSTATUS 00879 NTAPI 00880 ClassSendSrbSynchronous( 00881 _In_ PDEVICE_OBJECT DeviceObject, 00882 _Inout_ PSCSI_REQUEST_BLOCK Srb, 00883 _In_reads_bytes_opt_(BufferLength) PVOID BufferAddress, 00884 _In_ ULONG BufferLength, 00885 _In_ BOOLEAN WriteToDevice); 00886 00887 SCSIPORTAPI 00888 NTSTATUS 00889 NTAPI 00890 ClassSendSrbAsynchronous( 00891 _In_ PDEVICE_OBJECT DeviceObject, 00892 _Inout_ PSCSI_REQUEST_BLOCK Srb, 00893 _In_ PIRP Irp, 00894 _In_reads_bytes_opt_(BufferLength) __drv_aliasesMem PVOID BufferAddress, 00895 _In_ ULONG BufferLength, 00896 _In_ BOOLEAN WriteToDevice); 00897 00898 SCSIPORTAPI 00899 NTSTATUS 00900 NTAPI 00901 ClassBuildRequest( 00902 _In_ PDEVICE_OBJECT DeviceObject, 00903 _In_ PIRP Irp); 00904 00905 SCSIPORTAPI 00906 ULONG 00907 NTAPI 00908 ClassModeSense( 00909 _In_ PDEVICE_OBJECT DeviceObject, 00910 _In_reads_bytes_(Length) PCHAR ModeSenseBuffer, 00911 _In_ ULONG Length, 00912 _In_ UCHAR PageMode); 00913 00914 SCSIPORTAPI 00915 PVOID 00916 NTAPI 00917 ClassFindModePage( 00918 _In_reads_bytes_(Length) PCHAR ModeSenseBuffer, 00919 _In_ ULONG Length, 00920 _In_ UCHAR PageMode, 00921 _In_ BOOLEAN Use6Byte); 00922 00923 _IRQL_requires_max_(PASSIVE_LEVEL) 00924 SCSIPORTAPI 00925 NTSTATUS 00926 NTAPI 00927 ClassClaimDevice( 00928 _In_ PDEVICE_OBJECT LowerDeviceObject, 00929 _In_ BOOLEAN Release); 00930 00931 SCSIPORTAPI 00932 NTSTATUS 00933 NTAPI 00934 ClassInternalIoControl( 00935 PDEVICE_OBJECT DeviceObject, 00936 PIRP Irp); 00937 00938 _IRQL_requires_max_(PASSIVE_LEVEL) 00939 SCSIPORTAPI 00940 VOID 00941 NTAPI 00942 ClassInitializeSrbLookasideList( 00943 _Inout_ PCOMMON_DEVICE_EXTENSION CommonExtension, 00944 _In_ ULONG NumberElements); 00945 00946 _IRQL_requires_max_(PASSIVE_LEVEL) 00947 SCSIPORTAPI 00948 VOID 00949 NTAPI 00950 ClassDeleteSrbLookasideList( 00951 _Inout_ PCOMMON_DEVICE_EXTENSION CommonExtension); 00952 00953 _IRQL_requires_max_(PASSIVE_LEVEL) 00954 SCSIPORTAPI 00955 ULONG 00956 NTAPI 00957 ClassQueryTimeOutRegistryValue( 00958 _In_ PDEVICE_OBJECT DeviceObject); 00959 00960 _IRQL_requires_max_(PASSIVE_LEVEL) 00961 SCSIPORTAPI 00962 NTSTATUS 00963 NTAPI 00964 ClassGetDescriptor( 00965 _In_ PDEVICE_OBJECT DeviceObject, 00966 _In_ PSTORAGE_PROPERTY_ID PropertyId, 00967 _Outptr_ PSTORAGE_DESCRIPTOR_HEADER *Descriptor); 00968 00969 _IRQL_requires_max_(PASSIVE_LEVEL) 00970 SCSIPORTAPI 00971 VOID 00972 NTAPI 00973 ClassInvalidateBusRelations( 00974 _In_ PDEVICE_OBJECT Fdo); 00975 00976 _IRQL_requires_max_(PASSIVE_LEVEL) 00977 SCSIPORTAPI 00978 VOID 00979 NTAPI 00980 ClassMarkChildrenMissing( 00981 _In_ PFUNCTIONAL_DEVICE_EXTENSION Fdo); 00982 00983 _IRQL_requires_max_(PASSIVE_LEVEL) 00984 SCSIPORTAPI 00985 BOOLEAN 00986 NTAPI 00987 ClassMarkChildMissing( 00988 _In_ PPHYSICAL_DEVICE_EXTENSION PdoExtension, 00989 _In_ BOOLEAN AcquireChildLock); 00990 00991 SCSIPORTAPI 00992 VOID 00993 ClassDebugPrint( 00994 _In_ CLASS_DEBUG_LEVEL DebugPrintLevel, 00995 _In_z_ PCCHAR DebugMessage, 00996 ...); 00997 00998 __drv_aliasesMem 00999 _IRQL_requires_max_(DISPATCH_LEVEL) 01000 SCSIPORTAPI 01001 PCLASS_DRIVER_EXTENSION 01002 NTAPI 01003 ClassGetDriverExtension( 01004 _In_ PDRIVER_OBJECT DriverObject); 01005 01006 SCSIPORTAPI 01007 VOID 01008 NTAPI 01009 ClassCompleteRequest( 01010 _In_ PDEVICE_OBJECT DeviceObject, 01011 _In_ PIRP Irp, 01012 _In_ CCHAR PriorityBoost); 01013 01014 SCSIPORTAPI 01015 VOID 01016 NTAPI 01017 ClassReleaseRemoveLock( 01018 _In_ PDEVICE_OBJECT DeviceObject, 01019 PIRP Tag); 01020 01021 SCSIPORTAPI 01022 ULONG 01023 NTAPI 01024 ClassAcquireRemoveLockEx( 01025 _In_ PDEVICE_OBJECT DeviceObject, 01026 PVOID Tag, 01027 _In_ PCSTR File, 01028 _In_ ULONG Line); 01029 01030 _IRQL_requires_max_(PASSIVE_LEVEL) 01031 SCSIPORTAPI 01032 VOID 01033 NTAPI 01034 ClassUpdateInformationInRegistry( 01035 _In_ PDEVICE_OBJECT Fdo, 01036 _In_ PCHAR DeviceName, 01037 _In_ ULONG DeviceNumber, 01038 _In_reads_bytes_opt_(InquiryDataLength) PINQUIRYDATA InquiryData, 01039 _In_ ULONG InquiryDataLength); 01040 01041 SCSIPORTAPI 01042 NTSTATUS 01043 NTAPI 01044 ClassWmiCompleteRequest( 01045 _In_ PDEVICE_OBJECT DeviceObject, 01046 _Inout_ PIRP Irp, 01047 _In_ NTSTATUS Status, 01048 _In_ ULONG BufferUsed, 01049 _In_ CCHAR PriorityBoost); 01050 01051 _IRQL_requires_max_(DISPATCH_LEVEL) 01052 SCSIPORTAPI 01053 NTSTATUS 01054 NTAPI 01055 ClassWmiFireEvent( 01056 _In_ PDEVICE_OBJECT DeviceObject, 01057 _In_ LPGUID Guid, 01058 _In_ ULONG InstanceIndex, 01059 _In_ ULONG EventDataSize, 01060 _In_reads_bytes_(EventDataSize) PVOID EventData); 01061 01062 SCSIPORTAPI 01063 VOID 01064 NTAPI 01065 ClassResetMediaChangeTimer( 01066 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); 01067 01068 _IRQL_requires_max_(PASSIVE_LEVEL) 01069 SCSIPORTAPI 01070 VOID 01071 NTAPI 01072 ClassInitializeMediaChangeDetection( 01073 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, 01074 _In_ PUCHAR EventPrefix); 01075 01076 _IRQL_requires_max_(PASSIVE_LEVEL) 01077 SCSIPORTAPI 01078 NTSTATUS 01079 NTAPI 01080 ClassInitializeTestUnitPolling( 01081 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, 01082 _In_ BOOLEAN AllowDriveToSleep); 01083 01084 SCSIPORTAPI 01085 PVPB 01086 NTAPI 01087 ClassGetVpb( 01088 _In_ PDEVICE_OBJECT DeviceObject); 01089 01090 SCSIPORTAPI 01091 NTSTATUS 01092 NTAPI 01093 ClassSpinDownPowerHandler( 01094 _In_ PDEVICE_OBJECT DeviceObject, 01095 _In_ PIRP Irp); 01096 01097 NTSTATUS 01098 NTAPI 01099 ClassStopUnitPowerHandler( 01100 _In_ PDEVICE_OBJECT DeviceObject, 01101 _In_ PIRP Irp); 01102 01103 _IRQL_requires_max_(PASSIVE_LEVEL) 01104 NTSTATUS 01105 NTAPI 01106 ClassSetFailurePredictionPoll( 01107 _Inout_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, 01108 _In_ FAILURE_PREDICTION_METHOD FailurePredictionMethod, 01109 _In_ ULONG PollingPeriod); 01110 01111 _IRQL_requires_max_(DISPATCH_LEVEL) 01112 VOID 01113 NTAPI 01114 ClassNotifyFailurePredicted( 01115 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, 01116 _In_reads_bytes_(BufferSize) PUCHAR Buffer, 01117 _In_ ULONG BufferSize, 01118 _In_ BOOLEAN LogError, 01119 _In_ ULONG UniqueErrorValue, 01120 _In_ UCHAR PathId, 01121 _In_ UCHAR TargetId, 01122 _In_ UCHAR Lun); 01123 01124 _IRQL_requires_max_(PASSIVE_LEVEL) 01125 SCSIPORTAPI 01126 VOID 01127 NTAPI 01128 ClassAcquireChildLock( 01129 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); 01130 01131 SCSIPORTAPI 01132 VOID 01133 NTAPI 01134 ClassReleaseChildLock( 01135 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); 01136 01137 NTSTATUS 01138 NTAPI 01139 ClassSignalCompletion( 01140 PDEVICE_OBJECT DeviceObject, 01141 PIRP Irp, 01142 PKEVENT Event); 01143 01144 VOID 01145 NTAPI 01146 ClassSendStartUnit( 01147 _In_ PDEVICE_OBJECT DeviceObject); 01148 01149 _IRQL_requires_max_(PASSIVE_LEVEL) 01150 SCSIPORTAPI 01151 NTSTATUS 01152 NTAPI 01153 ClassRemoveDevice( 01154 _In_ PDEVICE_OBJECT DeviceObject, 01155 _In_ UCHAR RemoveType); 01156 01157 SCSIPORTAPI 01158 NTSTATUS 01159 NTAPI 01160 ClassAsynchronousCompletion( 01161 PDEVICE_OBJECT DeviceObject, 01162 PIRP Irp, 01163 PVOID Event); 01164 01165 SCSIPORTAPI 01166 VOID 01167 NTAPI 01168 ClassCheckMediaState( 01169 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); 01170 01171 SCSIPORTAPI 01172 NTSTATUS 01173 NTAPI 01174 ClassCheckVerifyComplete( 01175 PDEVICE_OBJECT DeviceObject, 01176 PIRP Irp, 01177 PVOID Context); 01178 01179 _IRQL_requires_max_(PASSIVE_LEVEL) 01180 SCSIPORTAPI 01181 VOID 01182 NTAPI 01183 ClassSetMediaChangeState( 01184 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, 01185 _In_ MEDIA_CHANGE_DETECTION_STATE State, 01186 _In_ BOOLEAN Wait); 01187 01188 _IRQL_requires_max_(PASSIVE_LEVEL) 01189 SCSIPORTAPI 01190 VOID 01191 NTAPI 01192 ClassEnableMediaChangeDetection( 01193 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); 01194 01195 _IRQL_requires_max_(PASSIVE_LEVEL) 01196 SCSIPORTAPI 01197 VOID 01198 NTAPI 01199 ClassDisableMediaChangeDetection( 01200 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); 01201 01202 _IRQL_requires_max_(PASSIVE_LEVEL) 01203 SCSIPORTAPI 01204 VOID 01205 NTAPI 01206 ClassCleanupMediaChangeDetection( 01207 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); 01208 01209 _IRQL_requires_max_(PASSIVE_LEVEL) 01210 VOID 01211 NTAPI 01212 ClassGetDeviceParameter( 01213 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, 01214 _In_opt_ PWSTR SubkeyName, 01215 _In_ PWSTR ParameterName, 01216 _Inout_ PULONG ParameterValue); 01217 01218 _IRQL_requires_max_(PASSIVE_LEVEL) 01219 NTSTATUS 01220 NTAPI 01221 ClassSetDeviceParameter( 01222 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, 01223 _In_opt_ PWSTR SubkeyName, 01224 _In_ PWSTR ParameterName, 01225 _In_ ULONG ParameterValue); 01226 01227 #if (NTDDI_VERSION >= NTDDI_VISTA) 01228 01229 _IRQL_requires_max_(PASSIVE_LEVEL) 01230 PFILE_OBJECT_EXTENSION 01231 NTAPI 01232 ClassGetFsContext( 01233 _In_ PCOMMON_DEVICE_EXTENSION CommonExtension, 01234 _In_ PFILE_OBJECT FileObject); 01235 01236 _IRQL_requires_max_(DISPATCH_LEVEL) 01237 VOID 01238 NTAPI 01239 ClassSendNotification( 01240 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, 01241 _In_ const GUID *Guid, 01242 _In_ ULONG ExtraDataSize, 01243 _In_reads_bytes_opt_(ExtraDataSize) PVOID ExtraData); 01244 01245 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ 01246 01247 static __inline 01248 BOOLEAN 01249 PORT_ALLOCATED_SENSE( 01250 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, 01251 _In_ PSCSI_REQUEST_BLOCK Srb) 01252 { 01253 return ((BOOLEAN)((TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_PORT_DRIVER_ALLOCSENSE) && 01254 TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)) && 01255 (Srb->SenseInfoBuffer != FdoExtension->SenseData))); 01256 } 01257 01258 static __inline 01259 VOID 01260 FREE_PORT_ALLOCATED_SENSE_BUFFER( 01261 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, 01262 _In_ PSCSI_REQUEST_BLOCK Srb) 01263 { 01264 ASSERT(TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_PORT_DRIVER_ALLOCSENSE)); 01265 ASSERT(TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)); 01266 ASSERT(Srb->SenseInfoBuffer != FdoExtension->SenseData); 01267 01268 ExFreePool(Srb->SenseInfoBuffer); 01269 Srb->SenseInfoBuffer = FdoExtension->SenseData; 01270 Srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE; 01271 CLEAR_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER); 01272 return; 01273 } 01274 01275 _IRQL_requires_max_(PASSIVE_LEVEL) 01276 typedef VOID 01277 (NTAPI *PCLASS_SCAN_FOR_SPECIAL_HANDLER)( 01278 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, 01279 _In_ ULONG_PTR Data); 01280 01281 _IRQL_requires_max_(PASSIVE_LEVEL) 01282 VOID 01283 NTAPI 01284 ClassScanForSpecial( 01285 _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, 01286 _In_ CLASSPNP_SCAN_FOR_SPECIAL_INFO DeviceList[], 01287 _In_ PCLASS_SCAN_FOR_SPECIAL_HANDLER Function); Generated on Wed May 23 2012 04:27:57 for ReactOS by
1.7.6.1
|