Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503
#pragma once
#define _CLASS_
#include <ntdddisk.h>#include <ntddcdrm.h>#include <ntddtape.h>#include <ntddscsi.h>#include <ntddstor.h>
#include <stdio.h>
#include <scsi.h>
#define max(a,b) (((a) > (b)) ? (a) : (b))#define min(a,b) (((a) < (b)) ? (a) : (b))
#define SRB_CLASS_FLAGS_LOW_PRIORITY 0x10000000#define SRB_CLASS_FLAGS_PERSISTANT 0x20000000#define SRB_CLASS_FLAGS_PAGING 0x40000000#define SRB_CLASS_FLAGS_FREE_MDL 0x80000000
#define ASSERT_FDO(x) \ ASSERT(((PCOMMON_DEVICE_EXTENSION) (x)->DeviceExtension)->IsFdo)
#define ASSERT_PDO(x) \ ASSERT(!(((PCOMMON_DEVICE_EXTENSION) (x)->DeviceExtension)->IsFdo))
#define IS_CLEANUP_REQUEST(majorFunction) \ ((majorFunction == IRP_MJ_CLOSE) || \ (majorFunction == IRP_MJ_CLEANUP) || \ (majorFunction == IRP_MJ_SHUTDOWN))
#define DO_MCD(fdoExtension) \ (((fdoExtension)->MediaChangeDetectionInfo != NULL) && \ ((fdoExtension)->MediaChangeDetectionInfo->MediaChangeDetectionDisableCount == 0))
#define IS_SCSIOP_READ(opCode) \ ((opCode == SCSIOP_READ6) || \ (opCode == SCSIOP_READ) || \ (opCode == SCSIOP_READ12) || \ (opCode == SCSIOP_READ16))
#define IS_SCSIOP_WRITE(opCode) \ ((opCode == SCSIOP_WRITE6) || \ (opCode == SCSIOP_WRITE) || \ (opCode == SCSIOP_WRITE12) || \ (opCode == SCSIOP_WRITE16))
#define IS_SCSIOP_READWRITE(opCode) (IS_SCSIOP_READ(opCode) || IS_SCSIOP_WRITE(opCode))
#define ADJUST_FUA_FLAG(fdoExt) { \ if (TEST_FLAG(fdoExt->DeviceFlags, DEV_WRITE_CACHE) && \ !TEST_FLAG(fdoExt->DeviceFlags, DEV_POWER_PROTECTED) && \ !TEST_FLAG(fdoExt->ScanForSpecialFlags, CLASS_SPECIAL_FUA_NOT_SUPPORTED) ) { \ fdoExt->CdbForceUnitAccess = TRUE; \ } else { \ fdoExt->CdbForceUnitAccess = FALSE; \ } \}
#define FREE_POOL(_PoolPtr) \ if (_PoolPtr != NULL) { \ ExFreePool(_PoolPtr); \ _PoolPtr = NULL; \ }
#ifdef POOL_TAGGING#undef ExAllocatePool#undef ExAllocatePoolWithQuota#define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'nUcS')//#define ExAllocatePool(a,b) #assert(0)#define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,'nUcS')#endif
#define CLASS_TAG_AUTORUN_DISABLE 'ALcS'#define CLASS_TAG_FILE_OBJECT_EXTENSION 'FLcS'#define CLASS_TAG_MEDIA_CHANGE_DETECTION 'MLcS'#define CLASS_TAG_MOUNT 'mLcS'#define CLASS_TAG_RELEASE_QUEUE 'qLcS'#define CLASS_TAG_POWER 'WLcS'#define CLASS_TAG_WMI 'wLcS'#define CLASS_TAG_FAILURE_PREDICT 'fLcS'#define CLASS_TAG_DEVICE_CONTROL 'OIcS'#define CLASS_TAG_MODE_DATA 'oLcS'#define CLASS_TAG_MULTIPATH 'mPcS'#define CLASS_TAG_LOCK_TRACKING 'TLcS'#define CLASS_TAG_LB_PROVISIONING 'PLcS'#define CLASS_TAG_MANAGE_DATASET 'MDcS'
#define MAXIMUM_RETRIES 4
#define CLASS_DRIVER_EXTENSION_KEY ((PVOID) ClassInitialize)
#define NO_REMOVE 0#define REMOVE_PENDING 1#define REMOVE_COMPLETE 2
#define ClassAcquireRemoveLock(devobj, tag) \ ClassAcquireRemoveLockEx(devobj, tag, __FILE__, __LINE__)
#ifdef TRY#undef TRY#endif#ifdef LEAVE#undef LEAVE#endif
#ifdef FINALLY#undef FINALLY#endif
#define TRY#define LEAVE goto __tryLabel;#define FINALLY __tryLabel:
#if defined DebugPrint#undef DebugPrint#endif
#if DBG#define DebugPrint(x) ClassDebugPrint x#else#define DebugPrint(x)#endif
#define DEBUG_BUFFER_LENGTH 256
#define START_UNIT_TIMEOUT (60 * 4)
#define MEDIA_CHANGE_DEFAULT_TIME 1#define MEDIA_CHANGE_TIMEOUT_TIME 300
#ifdef ALLOCATE_SRB_FROM_POOL
#define ClasspAllocateSrb(ext) \ ExAllocatePoolWithTag(NonPagedPool, \ sizeof(SCSI_REQUEST_BLOCK), \ 'sBRS')
#define ClasspFreeSrb(ext, srb) ExFreePool((srb));
#else /* ALLOCATE_SRB_FROM_POOL */
#define ClasspAllocateSrb(ext) \ ExAllocateFromNPagedLookasideList( \ &((ext)->CommonExtension.SrbLookasideList))
#define ClasspFreeSrb(ext, srb) \ ExFreeToNPagedLookasideList( \ &((ext)->CommonExtension.SrbLookasideList), \ (srb))
#endif /* ALLOCATE_SRB_FROM_POOL */
#define SET_FLAG(Flags, Bit) ((Flags) |= (Bit))#define CLEAR_FLAG(Flags, Bit) ((Flags) &= ~(Bit))#define TEST_FLAG(Flags, Bit) (((Flags) & (Bit)) != 0)
#define CLASS_WORKING_SET_MAXIMUM 2048
#define CLASS_INTERPRET_SENSE_INFO2_MAXIMUM_HISTORY_COUNT 30000
#define CLASS_SPECIAL_DISABLE_SPIN_DOWN 0x00000001#define CLASS_SPECIAL_DISABLE_SPIN_UP 0x00000002#define CLASS_SPECIAL_NO_QUEUE_LOCK 0x00000008#define CLASS_SPECIAL_DISABLE_WRITE_CACHE 0x00000010#define CLASS_SPECIAL_CAUSE_NOT_REPORTABLE_HACK 0x00000020#if ((NTDDI_VERSION == NTDDI_WIN2KSP3) || (OSVER(NTDDI_VERSION) == NTDDI_WINXP))#define CLASS_SPECIAL_DISABLE_WRITE_CACHE_NOT_SUPPORTED 0x00000040#endif#define CLASS_SPECIAL_MODIFY_CACHE_UNSUCCESSFUL 0x00000040#define CLASS_SPECIAL_FUA_NOT_SUPPORTED 0x00000080#define CLASS_SPECIAL_VALID_MASK 0x000000FB#define CLASS_SPECIAL_RESERVED (~CLASS_SPECIAL_VALID_MASK)
#define DEV_WRITE_CACHE 0x00000001#define DEV_USE_SCSI1 0x00000002#define DEV_SAFE_START_UNIT 0x00000004#define DEV_NO_12BYTE_CDB 0x00000008#define DEV_POWER_PROTECTED 0x00000010#define DEV_USE_16BYTE_CDB 0x00000020
#define GUID_CLASSPNP_QUERY_REGINFOEX {0x00e34b11, 0x2444, 0x4745, {0xa5, 0x3d, 0x62, 0x01, 0x00, 0xcd, 0x82, 0xf7}}#define GUID_CLASSPNP_SENSEINFO2 {0x509a8c5f, 0x71d7, 0x48f6, {0x82, 0x1e, 0x17, 0x3c, 0x49, 0xbf, 0x2f, 0x18}}#define GUID_CLASSPNP_WORKING_SET {0x105701b0, 0x9e9b, 0x47cb, {0x97, 0x80, 0x81, 0x19, 0x8a, 0xf7, 0xb5, 0x24}}#define GUID_CLASSPNP_SRB_SUPPORT {0x0a483941, 0xbdfd, 0x4f7b, {0xbe, 0x95, 0xce, 0xe2, 0xa2, 0x16, 0x09, 0x0c}}
#define DEFAULT_FAILURE_PREDICTION_PERIOD 60 * 60 * 1
#define MAXIMUM_RETRY_FOR_SINGLE_IO_IN_100NS_UNITS (0x3b9aca00)
static inline ULONG CountOfSetBitsUChar(UCHAR _X){ ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; }static inline ULONG CountOfSetBitsULong(ULONG _X){ ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; }static inline ULONG CountOfSetBitsULong32(ULONG32 _X){ ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; }static inline ULONG CountOfSetBitsULong64(ULONG64 _X){ ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; }static inline ULONG CountOfSetBitsUlongPtr(ULONG_PTR _X){ ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; }
typedef enum _MEDIA_CHANGE_DETECTION_STATE { MediaUnknown, MediaPresent, MediaNotPresent, MediaUnavailable} MEDIA_CHANGE_DETECTION_STATE, *PMEDIA_CHANGE_DETECTION_STATE;
typedef enum _CLASS_DEBUG_LEVEL { ClassDebugError = 0, ClassDebugWarning = 1, ClassDebugTrace = 2, ClassDebugInfo = 3, ClassDebugMediaLocks = 8, ClassDebugMCN = 9, ClassDebugDelayedRetry = 10, ClassDebugSenseInfo = 11, ClassDebugRemoveLock = 12, ClassDebugExternal4 = 13, ClassDebugExternal3 = 14, ClassDebugExternal2 = 15, ClassDebugExternal1 = 16} CLASS_DEBUG_LEVEL, *PCLASS_DEBUG_LEVEL;
typedef enum { EventGeneration, DataBlockCollection} CLASSENABLEDISABLEFUNCTION;
typedef enum { FailurePredictionNone = 0, FailurePredictionIoctl, FailurePredictionSmart, FailurePredictionSense} FAILURE_PREDICTION_METHOD, *PFAILURE_PREDICTION_METHOD;
typedef enum { PowerDownDeviceInitial, PowerDownDeviceLocked, PowerDownDeviceStopped, PowerDownDeviceOff, PowerDownDeviceUnlocked} CLASS_POWER_DOWN_STATE;
typedef enum { PowerDownDeviceInitial2, PowerDownDeviceLocked2, PowerDownDeviceFlushed2, PowerDownDeviceStopped2, PowerDownDeviceOff2, PowerDownDeviceUnlocked2} CLASS_POWER_DOWN_STATE2;
typedef enum { PowerDownDeviceInitial3 = 0, PowerDownDeviceLocked3, PowerDownDeviceQuiesced3, PowerDownDeviceFlushed3, PowerDownDeviceStopped3, PowerDownDeviceOff3, PowerDownDeviceUnlocked3} CLASS_POWER_DOWN_STATE3;
typedef enum { PowerUpDeviceInitial, PowerUpDeviceLocked, PowerUpDeviceOn, PowerUpDeviceStarted, PowerUpDeviceUnlocked} CLASS_POWER_UP_STATE;
struct _CLASS_INIT_DATA;typedef struct _CLASS_INIT_DATA CLASS_INIT_DATA, *PCLASS_INIT_DATA;
struct _CLASS_PRIVATE_FDO_DATA;typedef struct _CLASS_PRIVATE_FDO_DATA CLASS_PRIVATE_FDO_DATA, *PCLASS_PRIVATE_FDO_DATA;
struct _CLASS_PRIVATE_PDO_DATA;typedef struct _CLASS_PRIVATE_PDO_DATA CLASS_PRIVATE_PDO_DATA, *PCLASS_PRIVATE_PDO_DATA;
struct _CLASS_PRIVATE_COMMON_DATA;typedef struct _CLASS_PRIVATE_COMMON_DATA CLASS_PRIVATE_COMMON_DATA, *PCLASS_PRIVATE_COMMON_DATA;
struct _MEDIA_CHANGE_DETECTION_INFO;typedef struct _MEDIA_CHANGE_DETECTION_INFO MEDIA_CHANGE_DETECTION_INFO, *PMEDIA_CHANGE_DETECTION_INFO;
struct _DICTIONARY_HEADER;typedef struct _DICTIONARY_HEADER DICTIONARY_HEADER, *PDICTIONARY_HEADER;
typedef struct _DICTIONARY { ULONGLONG Signature; struct _DICTIONARY_HEADER* List; KSPIN_LOCK SpinLock;} DICTIONARY, *PDICTIONARY;
typedef struct _CLASSPNP_SCAN_FOR_SPECIAL_INFO { PCHAR VendorId; PCHAR ProductId; PCHAR ProductRevision; ULONG_PTR Data;} CLASSPNP_SCAN_FOR_SPECIAL_INFO, *PCLASSPNP_SCAN_FOR_SPECIAL_INFO;
_IRQL_requires_max_(DISPATCH_LEVEL)typedef VOID(NTAPI *PCLASS_ERROR)( _In_ PDEVICE_OBJECT DeviceObject, _In_ PSCSI_REQUEST_BLOCK Srb, _Out_ NTSTATUS *Status, _Inout_ BOOLEAN *Retry);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_ADD_DEVICE)( _In_ PDRIVER_OBJECT DriverObject, _In_ PDEVICE_OBJECT Pdo);
typedef NTSTATUS(NTAPI *PCLASS_POWER_DEVICE)( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_START_DEVICE)( _In_ PDEVICE_OBJECT DeviceObject);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_STOP_DEVICE)( _In_ PDEVICE_OBJECT DeviceObject, _In_ UCHAR Type);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_INIT_DEVICE)( _In_ PDEVICE_OBJECT DeviceObject);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_ENUM_DEVICE)( _In_ PDEVICE_OBJECT DeviceObject);
_IRQL_requires_max_(DISPATCH_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_READ_WRITE)( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp);
_IRQL_requires_max_(DISPATCH_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_DEVICE_CONTROL)( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp);
_IRQL_requires_max_(DISPATCH_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_SHUTDOWN_FLUSH)( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_CREATE_CLOSE)( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_QUERY_ID)( _In_ PDEVICE_OBJECT DeviceObject, _In_ BUS_QUERY_ID_TYPE IdType, _In_ PUNICODE_STRING IdString);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_REMOVE_DEVICE)( _In_ PDEVICE_OBJECT DeviceObject, _In_ UCHAR Type);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef VOID(NTAPI *PCLASS_UNLOAD)( _In_ PDRIVER_OBJECT DriverObject);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_QUERY_PNP_CAPABILITIES)( _In_ PDEVICE_OBJECT PhysicalDeviceObject, _In_ PDEVICE_CAPABILITIES Capabilities);
_IRQL_requires_(DISPATCH_LEVEL)typedef VOID(NTAPI *PCLASS_TICK)( _In_ PDEVICE_OBJECT DeviceObject);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_QUERY_WMI_REGINFO_EX)( _In_ PDEVICE_OBJECT DeviceObject, _Out_ ULONG *RegFlags, _Out_ PUNICODE_STRING Name, _Out_ PUNICODE_STRING MofResourceName);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_QUERY_WMI_REGINFO)( _In_ PDEVICE_OBJECT DeviceObject, _Out_ ULONG *RegFlags, _Out_ PUNICODE_STRING Name);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_QUERY_WMI_DATABLOCK)( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ ULONG GuidIndex, _In_ ULONG BufferAvail, _Out_writes_bytes_(BufferAvail) PUCHAR Buffer);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_SET_WMI_DATABLOCK)( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ ULONG GuidIndex, _In_ ULONG BufferSize, _In_reads_bytes_(BufferSize) PUCHAR Buffer);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_SET_WMI_DATAITEM)( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ ULONG GuidIndex, _In_ ULONG DataItemId, _In_ ULONG BufferSize, _In_reads_bytes_(BufferSize) PUCHAR Buffer);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_EXECUTE_WMI_METHOD)( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ ULONG GuidIndex, _In_ ULONG MethodId, _In_ ULONG InBufferSize, _In_ ULONG OutBufferSize, _In_reads_(_Inexpressible_(max(InBufferSize, OutBufferSize))) PUCHAR Buffer);
_IRQL_requires_max_(PASSIVE_LEVEL)typedef NTSTATUS(NTAPI *PCLASS_WMI_FUNCTION_CONTROL)( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ ULONG GuidIndex, _In_ CLASSENABLEDISABLEFUNCTION Function, _In_ BOOLEAN Enable);
typedef struct _SRB_HISTORY_ITEM { LARGE_INTEGER TickCountSent; LARGE_INTEGER TickCountCompleted; ULONG MillisecondsDelayOnRetry; SENSE_DATA NormalizedSenseData; UCHAR SrbStatus; UCHAR ClassDriverUse;} SRB_HISTORY_ITEM, *PSRB_HISTORY_ITEM;
typedef struct _SRB_HISTORY { ULONG_PTR ClassDriverUse[4]; _Field_range_(1,30000) ULONG TotalHistoryCount; _Field_range_(0,TotalHistoryCount) ULONG UsedHistoryCount; _Field_size_part_(TotalHistoryCount, UsedHistoryCount) SRB_HISTORY_ITEM History[1];} SRB_HISTORY, *PSRB_HISTORY;
_IRQL_requires_max_(DISPATCH_LEVEL)typedef BOOLEAN(NTAPI *PCLASS_INTERPRET_SENSE_INFO)( _In_ PDEVICE_OBJECT Fdo, _In_opt_ PIRP OriginalRequest, _In_ PSCSI_REQUEST_BLOCK Srb, _In_ UCHAR MajorFunctionCode, _In_ ULONG IoDeviceCode, _In_ ULONG PreviousRetryCount, _In_opt_ SRB_HISTORY *RequestHistory, _Out_ NTSTATUS *Status, _Out_ _Deref_out_range_(0,MAXIMUM_RETRY_FOR_SINGLE_IO_IN_100NS_UNITS) LONGLONG *RetryIn100nsUnits);
_IRQL_requires_max_(DISPATCH_LEVEL)_At_(RequestHistory->UsedHistoryCount, _Pre_equal_to_(RequestHistory->TotalHistoryCount) _Out_range_(0, RequestHistory->TotalHistoryCount - 1))typedef VOID(NTAPI *PCLASS_COMPRESS_RETRY_HISTORY_DATA)( _In_ PDEVICE_OBJECT DeviceObject, _Inout_ PSRB_HISTORY RequestHistory);
typedef struct { GUID Guid; ULONG InstanceCount; ULONG Flags;} GUIDREGINFO, *PGUIDREGINFO;
typedef struct _CLASS_WMI_INFO { ULONG GuidCount; PGUIDREGINFO GuidRegInfo; PCLASS_QUERY_WMI_REGINFO ClassQueryWmiRegInfo; PCLASS_QUERY_WMI_DATABLOCK ClassQueryWmiDataBlock; PCLASS_SET_WMI_DATABLOCK ClassSetWmiDataBlock; PCLASS_SET_WMI_DATAITEM ClassSetWmiDataItem; PCLASS_EXECUTE_WMI_METHOD ClassExecuteWmiMethod; PCLASS_WMI_FUNCTION_CONTROL ClassWmiFunctionControl;} CLASS_WMI_INFO, *PCLASS_WMI_INFO;
typedef struct _CLASS_DEV_INFO { ULONG DeviceExtensionSize; DEVICE_TYPE DeviceType; UCHAR StackSize; ULONG DeviceCharacteristics; PCLASS_ERROR ClassError; PCLASS_READ_WRITE ClassReadWriteVerification; PCLASS_DEVICE_CONTROL ClassDeviceControl; PCLASS_SHUTDOWN_FLUSH ClassShutdownFlush; PCLASS_CREATE_CLOSE ClassCreateClose; PCLASS_INIT_DEVICE ClassInitDevice; PCLASS_START_DEVICE ClassStartDevice; PCLASS_POWER_DEVICE ClassPowerDevice; PCLASS_STOP_DEVICE ClassStopDevice; PCLASS_REMOVE_DEVICE ClassRemoveDevice; PCLASS_QUERY_PNP_CAPABILITIES ClassQueryPnpCapabilities; CLASS_WMI_INFO ClassWmiInfo;} CLASS_DEV_INFO, *PCLASS_DEV_INFO;
struct _CLASS_INIT_DATA { ULONG InitializationDataSize; CLASS_DEV_INFO FdoData; CLASS_DEV_INFO PdoData; PCLASS_ADD_DEVICE ClassAddDevice; PCLASS_ENUM_DEVICE ClassEnumerateDevice; PCLASS_QUERY_ID ClassQueryId; PDRIVER_STARTIO ClassStartIo; PCLASS_UNLOAD ClassUnload; PCLASS_TICK ClassTick;};
typedef struct _FILE_OBJECT_EXTENSION { PFILE_OBJECT FileObject; PDEVICE_OBJECT DeviceObject; ULONG LockCount; ULONG McnDisableCount;} FILE_OBJECT_EXTENSION, *PFILE_OBJECT_EXTENSION;
typedef struct _CLASS_WORKING_SET { _Field_range_(sizeof(CLASS_WORKING_SET),sizeof(CLASS_WORKING_SET)) ULONG Size; _Field_range_(0,2048) ULONG XferPacketsWorkingSetMaximum; _Field_range_(0,2048) ULONG XferPacketsWorkingSetMinimum;} CLASS_WORKING_SET, *PCLASS_WORKING_SET;
typedef struct _CLASS_INTERPRET_SENSE_INFO2 { _Field_range_(sizeof(CLASS_INTERPRET_SENSE_INFO),sizeof(CLASS_INTERPRET_SENSE_INFO)) ULONG Size; _Field_range_(1,30000) ULONG HistoryCount; __callback PCLASS_COMPRESS_RETRY_HISTORY_DATA Compress; __callback PCLASS_INTERPRET_SENSE_INFO Interpret;} CLASS_INTERPRET_SENSE_INFO2, *PCLASS_INTERPRET_SENSE_INFO2;
C_ASSERT((MAXULONG - sizeof(SRB_HISTORY)) / 30000 >= sizeof(SRB_HISTORY_ITEM));
// for SrbSupport#define CLASS_SRB_SCSI_REQUEST_BLOCK 0x1#define CLASS_SRB_STORAGE_REQUEST_BLOCK 0x2
typedef struct _CLASS_DRIVER_EXTENSION { UNICODE_STRING RegistryPath; CLASS_INIT_DATA InitData; ULONG DeviceCount;#if (NTDDI_VERSION >= NTDDI_WINXP) PCLASS_QUERY_WMI_REGINFO_EX ClassFdoQueryWmiRegInfoEx; PCLASS_QUERY_WMI_REGINFO_EX ClassPdoQueryWmiRegInfoEx;#endif#if (NTDDI_VERSION >= NTDDI_VISTA) REGHANDLE EtwHandle; PDRIVER_DISPATCH DeviceMajorFunctionTable[IRP_MJ_MAXIMUM_FUNCTION + 1]; PDRIVER_DISPATCH MpDeviceMajorFunctionTable[IRP_MJ_MAXIMUM_FUNCTION + 1]; PCLASS_INTERPRET_SENSE_INFO2 InterpretSenseInfo; PCLASS_WORKING_SET WorkingSet;#endif#if (NTDDI_VERSION >= NTDDI_WIN8) ULONG SrbSupport;#endif} CLASS_DRIVER_EXTENSION, *PCLASS_DRIVER_EXTENSION;
typedef struct _COMMON_DEVICE_EXTENSION { ULONG Version; PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT LowerDeviceObject; struct _FUNCTIONAL_DEVICE_EXTENSION *PartitionZeroExtension; PCLASS_DRIVER_EXTENSION DriverExtension; LONG RemoveLock; KEVENT RemoveEvent; KSPIN_LOCK RemoveTrackingSpinlock; PVOID RemoveTrackingList; LONG RemoveTrackingUntrackedCount; PVOID DriverData; _ANONYMOUS_STRUCT struct { BOOLEAN IsFdo:1; BOOLEAN IsInitialized:1; BOOLEAN IsSrbLookasideListInitialized:1; } DUMMYSTRUCTNAME; UCHAR PreviousState; UCHAR CurrentState; ULONG IsRemoved; UNICODE_STRING DeviceName; struct _PHYSICAL_DEVICE_EXTENSION *ChildList; ULONG PartitionNumber; LARGE_INTEGER PartitionLength; LARGE_INTEGER StartingOffset; PCLASS_DEV_INFO DevInfo; ULONG PagingPathCount; ULONG DumpPathCount; ULONG HibernationPathCount; KEVENT PathCountEvent;#ifndef ALLOCATE_SRB_FROM_POOL NPAGED_LOOKASIDE_LIST SrbLookasideList;#endif UNICODE_STRING MountedDeviceInterfaceName; ULONG GuidCount; PGUIDREGINFO GuidRegInfo; DICTIONARY FileObjectDictionary;#if (NTDDI_VERSION >= NTDDI_WINXP) PCLASS_PRIVATE_COMMON_DATA PrivateCommonData;#else ULONG_PTR Reserved1;#endif#if (NTDDI_VERSION >= NTDDI_VISTA) PDRIVER_DISPATCH *DispatchTable;#else ULONG_PTR Reserved2;#endif ULONG_PTR Reserved3; ULONG_PTR Reserved4;} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
typedef struct _PHYSICAL_DEVICE_EXTENSION { _ANONYMOUS_UNION union { _ANONYMOUS_STRUCT struct { ULONG Version; PDEVICE_OBJECT DeviceObject; } DUMMYSTRUCTNAME; COMMON_DEVICE_EXTENSION CommonExtension; } DUMMYUNIONNAME; BOOLEAN IsMissing; BOOLEAN IsEnumerated;#if (NTDDI_VERSION >= NTDDI_WINXP) PCLASS_PRIVATE_PDO_DATA PrivatePdoData;#else ULONG_PTR Reserved1;#endif ULONG_PTR Reserved2; ULONG_PTR Reserved3; ULONG_PTR Reserved4;} PHYSICAL_DEVICE_EXTENSION, *PPHYSICAL_DEVICE_EXTENSION;
typedef struct _CLASS_POWER_OPTIONS { ULONG PowerDown:1; ULONG LockQueue:1; ULONG HandleSpinDown:1; ULONG HandleSpinUp:1; ULONG Reserved:27;} CLASS_POWER_OPTIONS, *PCLASS_POWER_OPTIONS;
typedef struct _CLASS_POWER_CONTEXT { union { CLASS_POWER_DOWN_STATE PowerDown; CLASS_POWER_DOWN_STATE2 PowerDown2; CLASS_POWER_DOWN_STATE3 PowerDown3; CLASS_POWER_UP_STATE PowerUp; } PowerChangeState; CLASS_POWER_OPTIONS Options; BOOLEAN InUse; BOOLEAN QueueLocked; NTSTATUS FinalStatus; ULONG RetryCount; ULONG RetryInterval; PIO_COMPLETION_ROUTINE CompletionRoutine; PDEVICE_OBJECT DeviceObject; PIRP Irp; SCSI_REQUEST_BLOCK Srb;} CLASS_POWER_CONTEXT, *PCLASS_POWER_CONTEXT;
#if (NTDDI_VERSION >= NTDDI_WIN8)
#define CLASS_SRBEX_SCSI_CDB16_BUFFER_SIZE (sizeof(STORAGE_REQUEST_BLOCK) + sizeof(STOR_ADDR_BTL8) + sizeof(SRBEX_DATA_SCSI_CDB16))#define CLASS_SRBEX_NO_SRBEX_DATA_BUFFER_SIZE (sizeof(STORAGE_REQUEST_BLOCK) + sizeof(STOR_ADDR_BTL8))
#endif
typedef struct _COMPLETION_CONTEXT { PDEVICE_OBJECT DeviceObject;#if (NTDDI_VERSION >= NTDDI_WIN8) union { SCSI_REQUEST_BLOCK Srb; STORAGE_REQUEST_BLOCK SrbEx; UCHAR SrbExBuffer[CLASS_SRBEX_SCSI_CDB16_BUFFER_SIZE]; } Srb;#else SCSI_REQUEST_BLOCK Srb;#endif} COMPLETION_CONTEXT, *PCOMPLETION_CONTEXT;
_IRQL_requires_max_(PASSIVE_LEVEL)_Must_inspect_result_SCSIPORT_APIULONGNTAPIClassInitialize( _In_ PVOID Argument1, _In_ PVOID Argument2, _In_ PCLASS_INIT_DATA InitializationData);
typedef struct _CLASS_QUERY_WMI_REGINFO_EX_LIST { ULONG Size; __callback PCLASS_QUERY_WMI_REGINFO_EX ClassFdoQueryWmiRegInfoEx; __callback PCLASS_QUERY_WMI_REGINFO_EX ClassPdoQueryWmiRegInfoEx;} CLASS_QUERY_WMI_REGINFO_EX_LIST, *PCLASS_QUERY_WMI_REGINFO_EX_LIST;
typedef enum{ SupportUnknown = 0, Supported, NotSupported} CLASS_FUNCTION_SUPPORT;
typedef struct _CLASS_VPD_B1_DATA{ NTSTATUS CommandStatus; USHORT MediumRotationRate; UCHAR NominalFormFactor; UCHAR Zoned; ULONG MediumProductType; ULONG DepopulationTime;} CLASS_VPD_B1_DATA, *PCLASS_VPD_B1_DATA;
typedef struct _CLASS_VPD_B0_DATA{ NTSTATUS CommandStatus; ULONG MaxUnmapLbaCount; ULONG MaxUnmapBlockDescrCount; ULONG OptimalUnmapGranularity; ULONG UnmapGranularityAlignment; BOOLEAN UGAVALID; UCHAR Reserved0; USHORT OptimalTransferLengthGranularity; ULONG MaximumTransferLength; ULONG OptimalTransferLength;} CLASS_VPD_B0_DATA, *PCLASS_VPD_B0_DATA;
#ifdef _MSC_VER#pragma warning(push)#pragma warning(disable:4214)#endiftypedef struct _CLASS_VPD_B2_DATA{ NTSTATUS CommandStatus; UCHAR ThresholdExponent; UCHAR DP:1; UCHAR ANC_SUP:1; UCHAR Reserved0:2; UCHAR LBPRZ:1; UCHAR LBPWS10:1; UCHAR LBPWS:1; UCHAR LBPU:1; UCHAR ProvisioningType:3; UCHAR Reserved1:5; ULONG SoftThresholdEventPending;} CLASS_VPD_B2_DATA, *PCLASS_VPD_B2_DATA;#ifdef _MSC_VER#pragma warning(pop)#endif
typedef struct _CLASS_READ_CAPACITY16_DATA{ NTSTATUS CommandStatus; ULONG BytesPerLogicalSector; ULONG BytesPerPhysicalSector; ULONG BytesOffsetForSectorAlignment; BOOLEAN LBProvisioningEnabled; BOOLEAN LBProvisioningReadZeros; UCHAR Reserved0[2]; ULONG Reserved1;} CLASS_READ_CAPACITY16_DATA, *PCLASS_READ_CAPACITY16_DATA;
typedef struct _CLASS_VPD_ECOP_BLOCK_DEVICE_ROD_LIMITS{ NTSTATUS CommandStatus; USHORT MaximumRangeDescriptors; UCHAR Restricted; UCHAR Reserved; ULONG MaximumInactivityTimer; ULONG DefaultInactivityTimer; ULONGLONG MaximumTokenTransferSize; ULONGLONG OptimalTransferCount;} CLASS_VPD_ECOP_BLOCK_DEVICE_ROD_LIMITS, *PCLASS_VPD_ECOP_BLOCK_DEVICE_ROD_LIMITS;
#ifdef _MSC_VER#pragma warning(push)#pragma warning(disable:4214)#endiftypedef struct _CLASS_FUNCTION_SUPPORT_INFO{ KSPIN_LOCK SyncLock; ULONG GenerationCount; volatile ULONG ChangeRequestCount; struct { ULONG BlockLimits:1; ULONG BlockDeviceCharacteristics:1; ULONG LBProvisioning:1; ULONG BlockDeviceRODLimits:1; ULONG ZonedBlockDeviceCharacteristics:1; ULONG Reserved:22; ULONG DeviceType:5; } ValidInquiryPages; struct { CLASS_FUNCTION_SUPPORT SeekPenaltyProperty; CLASS_FUNCTION_SUPPORT AccessAlignmentProperty; CLASS_FUNCTION_SUPPORT TrimProperty; CLASS_FUNCTION_SUPPORT TrimProcess; } LowerLayerSupport; BOOLEAN RegAccessAlignmentQueryNotSupported; BOOLEAN AsynchronousNotificationSupported;#if (NTDDI_VERSION >= NTDDI_WIN10_RS2) BOOLEAN UseModeSense10; UCHAR Reserved;#else UCHAR Reserved[2];#endif CLASS_VPD_B0_DATA BlockLimitsData; CLASS_VPD_B1_DATA DeviceCharacteristicsData; CLASS_VPD_B2_DATA LBProvisioningData; CLASS_READ_CAPACITY16_DATA ReadCapacity16Data; CLASS_VPD_ECOP_BLOCK_DEVICE_ROD_LIMITS BlockDeviceRODLimitsData; struct { ULONG D3ColdSupported:1; ULONG DeviceWakeable:1; ULONG IdlePowerEnabled:1; ULONG D3IdleTimeoutOverridden:1; ULONG NoVerifyDuringIdlePower:1; ULONG Reserved2:27; ULONG D3IdleTimeout; } IdlePower;
#if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) CLASS_FUNCTION_SUPPORT HwFirmwareGetInfoSupport; PSTORAGE_HW_FIRMWARE_INFO HwFirmwareInfo;#endif} CLASS_FUNCTION_SUPPORT_INFO, *PCLASS_FUNCTION_SUPPORT_INFO;#ifdef _MSC_VER#pragma warning(pop)#endif
typedef struct _FUNCTIONAL_DEVICE_EXTENSION { _ANONYMOUS_UNION union { _ANONYMOUS_STRUCT struct { ULONG Version; PDEVICE_OBJECT DeviceObject; } DUMMYSTRUCTNAME; COMMON_DEVICE_EXTENSION CommonExtension; } DUMMYUNIONNAME; PDEVICE_OBJECT LowerPdo; PSTORAGE_DEVICE_DESCRIPTOR DeviceDescriptor; PSTORAGE_ADAPTER_DESCRIPTOR AdapterDescriptor; DEVICE_POWER_STATE DevicePowerState; ULONG DMByteSkew; ULONG DMSkew; BOOLEAN DMActive;#if (NTDDI_VERSION >= NTDDI_WIN8) UCHAR SenseDataLength;#else UCHAR Reserved;#endif UCHAR Reserved0[2]; DISK_GEOMETRY DiskGeometry; PSENSE_DATA SenseData; ULONG TimeOutValue; ULONG DeviceNumber; ULONG SrbFlags; ULONG ErrorCount; LONG LockCount; LONG ProtectedLockCount; LONG InternalLockCount; KEVENT EjectSynchronizationEvent; USHORT DeviceFlags; UCHAR SectorShift;#if (NTDDI_VERSION >= NTDDI_VISTA) UCHAR CdbForceUnitAccess;#else UCHAR ReservedByte;#endif PMEDIA_CHANGE_DETECTION_INFO MediaChangeDetectionInfo; PKEVENT Unused1; HANDLE Unused2; FILE_OBJECT_EXTENSION KernelModeMcnContext; ULONG MediaChangeCount; HANDLE DeviceDirectory; KSPIN_LOCK ReleaseQueueSpinLock; PIRP ReleaseQueueIrp; SCSI_REQUEST_BLOCK ReleaseQueueSrb; BOOLEAN ReleaseQueueNeeded; BOOLEAN ReleaseQueueInProgress; BOOLEAN ReleaseQueueIrpFromPool; BOOLEAN FailurePredicted; ULONG FailureReason; struct _FAILURE_PREDICTION_INFO* FailurePredictionInfo; BOOLEAN PowerDownInProgress; ULONG EnumerationInterlock; KEVENT ChildLock; PKTHREAD ChildLockOwner; ULONG ChildLockAcquisitionCount; ULONG ScanForSpecialFlags; KDPC PowerRetryDpc; KTIMER PowerRetryTimer; CLASS_POWER_CONTEXT PowerContext;
#if (NTDDI_VERSION <= NTDDI_WIN2K)
#if (SPVER(NTDDI_VERSION) < 2)) ULONG_PTR Reserved1; ULONG_PTR Reserved2; ULONG_PTR Reserved3; ULONG_PTR Reserved4;#else ULONG CompletionSuccessCount; ULONG SavedSrbFlags; ULONG SavedErrorCount; ULONG_PTR Reserved1;#endif /* (SPVER(NTDDI_VERSION) < 2) */
#else /* (NTDDI_VERSION <= NTDDI_WIN2K) */
PCLASS_PRIVATE_FDO_DATA PrivateFdoData;#if (NTDDI_VERSION >= NTDDI_WIN8) PCLASS_FUNCTION_SUPPORT_INFO FunctionSupportInfo; PSTORAGE_MINIPORT_DESCRIPTOR MiniportDescriptor;#else ULONG_PTR Reserved2; ULONG_PTR Reserved3;#endif
#if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) PADDITIONAL_FDO_DATA AdditionalFdoData;#else ULONG_PTR Reserved4;#endif#endif /* (NTDDI_VERSION <= NTDDI_WIN2K) */
} FUNCTIONAL_DEVICE_EXTENSION, *PFUNCTIONAL_DEVICE_EXTENSION;
_IRQL_requires_max_(PASSIVE_LEVEL)_Must_inspect_result_SCSIPORT_APIULONGNTAPIClassInitializeEx( _In_ PDRIVER_OBJECT DriverObject, _In_ LPGUID Guid, _In_ PVOID Data);
_IRQL_requires_max_(PASSIVE_LEVEL)_Must_inspect_result__Post_satisfies_(return <= 0)SCSIPORT_APINTSTATUSNTAPIClassCreateDeviceObject( _In_ PDRIVER_OBJECT DriverObject, _In_z_ PCCHAR ObjectNameBuffer, _In_ PDEVICE_OBJECT LowerDeviceObject, _In_ BOOLEAN IsFdo, _Outptr_result_nullonfailure_ _At_(*DeviceObject, __drv_allocatesMem(Mem) __drv_aliasesMem) PDEVICE_OBJECT *DeviceObject);
_Must_inspect_result_SCSIPORT_APINTSTATUSNTAPIClassReadDriveCapacity( _In_ PDEVICE_OBJECT DeviceObject);
SCSIPORT_APIVOIDNTAPIClassReleaseQueue( _In_ PDEVICE_OBJECT DeviceObject);
SCSIPORT_APIVOIDNTAPIClassSplitRequest( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ ULONG MaximumBytes);
SCSIPORT_APINTSTATUSNTAPIClassDeviceControl( _In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp);
SCSIPORT_APINTSTATUSNTAPIClassIoComplete( PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context);
SCSIPORT_APINTSTATUSNTAPIClassIoCompleteAssociated( PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context);
SCSIPORT_APIBOOLEANNTAPIClassInterpretSenseInfo( _In_ PDEVICE_OBJECT DeviceObject, _In_ PSCSI_REQUEST_BLOCK Srb, _In_ UCHAR MajorFunctionCode, _In_ ULONG IoDeviceCode, _In_ ULONG RetryCount, _Out_ NTSTATUS *Status, _Out_opt_ _Deref_out_range_(0,100) ULONG *RetryInterval);
VOIDNTAPIClassSendDeviceIoControlSynchronous( _In_ ULONG IoControlCode, _In_ PDEVICE_OBJECT TargetDeviceObject, _Inout_updates_opt_(_Inexpressible_(max(InputBufferLength, OutputBufferLength))) PVOID Buffer, _In_ ULONG InputBufferLength, _In_ ULONG OutputBufferLength, _In_ BOOLEAN InternalDeviceIoControl, _Out_ PIO_STATUS_BLOCK IoStatus);
SCSIPORT_APINTSTATUSNTAPIClassSendIrpSynchronous( _In_ PDEVICE_OBJECT TargetDeviceObject, _In_ PIRP Irp);
SCSIPORT_APINTSTATUSNTAPIClassForwardIrpSynchronous( _In_ PCOMMON_DEVICE_EXTENSION CommonExtension, _In_ PIRP Irp);
SCSIPORT_APINTSTATUSNTAPIClassSendSrbSynchronous( _In_ PDEVICE_OBJECT DeviceObject, _Inout_ PSCSI_REQUEST_BLOCK Srb, _In_reads_bytes_opt_(BufferLength) PVOID BufferAddress, _In_ ULONG BufferLength, _In_ BOOLEAN WriteToDevice);
SCSIPORT_APINTSTATUSNTAPIClassSendSrbAsynchronous( _In_ PDEVICE_OBJECT DeviceObject, _Inout_ PSCSI_REQUEST_BLOCK Srb, _In_ PIRP Irp, _In_reads_bytes_opt_(BufferLength) __drv_aliasesMem PVOID BufferAddress, _In_ ULONG BufferLength, _In_ BOOLEAN WriteToDevice);
SCSIPORT_APINTSTATUSNTAPIClassBuildRequest( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp);
SCSIPORT_APIULONGNTAPIClassModeSense( _In_ PDEVICE_OBJECT DeviceObject, _In_reads_bytes_(Length) PCHAR ModeSenseBuffer, _In_ ULONG Length, _In_ UCHAR PageMode);
SCSIPORT_APIPVOIDNTAPIClassFindModePage( _In_reads_bytes_(Length) PCHAR ModeSenseBuffer, _In_ ULONG Length, _In_ UCHAR PageMode, _In_ BOOLEAN Use6Byte);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APINTSTATUSNTAPIClassClaimDevice( _In_ PDEVICE_OBJECT LowerDeviceObject, _In_ BOOLEAN Release);
SCSIPORT_APINTSTATUSNTAPIClassInternalIoControl( PDEVICE_OBJECT DeviceObject, PIRP Irp);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APIVOIDNTAPIClassInitializeSrbLookasideList( _Inout_ PCOMMON_DEVICE_EXTENSION CommonExtension, _In_ ULONG NumberElements);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APIVOIDNTAPIClassDeleteSrbLookasideList( _Inout_ PCOMMON_DEVICE_EXTENSION CommonExtension);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APIULONGNTAPIClassQueryTimeOutRegistryValue( _In_ PDEVICE_OBJECT DeviceObject);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APINTSTATUSNTAPIClassGetDescriptor( _In_ PDEVICE_OBJECT DeviceObject, _In_ PSTORAGE_PROPERTY_ID PropertyId, _Outptr_ PVOID *Descriptor);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APIVOIDNTAPIClassInvalidateBusRelations( _In_ PDEVICE_OBJECT Fdo);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APIVOIDNTAPIClassMarkChildrenMissing( _In_ PFUNCTIONAL_DEVICE_EXTENSION Fdo);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APIBOOLEANNTAPIClassMarkChildMissing( _In_ PPHYSICAL_DEVICE_EXTENSION PdoExtension, _In_ BOOLEAN AcquireChildLock);
SCSIPORT_APIVOIDClassDebugPrint( _In_ CLASS_DEBUG_LEVEL DebugPrintLevel, _In_z_ PCCHAR DebugMessage, ...);
__drv_aliasesMem_IRQL_requires_max_(DISPATCH_LEVEL)SCSIPORT_APIPCLASS_DRIVER_EXTENSIONNTAPIClassGetDriverExtension( _In_ PDRIVER_OBJECT DriverObject);
SCSIPORT_APIVOIDNTAPIClassCompleteRequest( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ CCHAR PriorityBoost);
SCSIPORT_APIVOIDNTAPIClassReleaseRemoveLock( _In_ PDEVICE_OBJECT DeviceObject, PIRP Tag);
SCSIPORT_APIULONGNTAPIClassAcquireRemoveLockEx( _In_ PDEVICE_OBJECT DeviceObject, PVOID Tag, _In_ PCSTR File, _In_ ULONG Line);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APIVOIDNTAPIClassUpdateInformationInRegistry( _In_ PDEVICE_OBJECT Fdo, _In_ PCHAR DeviceName, _In_ ULONG DeviceNumber, _In_reads_bytes_opt_(InquiryDataLength) PINQUIRYDATA InquiryData, _In_ ULONG InquiryDataLength);
SCSIPORT_APINTSTATUSNTAPIClassWmiCompleteRequest( _In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp, _In_ NTSTATUS Status, _In_ ULONG BufferUsed, _In_ CCHAR PriorityBoost);
_IRQL_requires_max_(DISPATCH_LEVEL)SCSIPORT_APINTSTATUSNTAPIClassWmiFireEvent( _In_ PDEVICE_OBJECT DeviceObject, _In_ LPGUID Guid, _In_ ULONG InstanceIndex, _In_ ULONG EventDataSize, _In_reads_bytes_(EventDataSize) PVOID EventData);
SCSIPORT_APIVOIDNTAPIClassResetMediaChangeTimer( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APIVOIDNTAPIClassInitializeMediaChangeDetection( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ PUCHAR EventPrefix);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APINTSTATUSNTAPIClassInitializeTestUnitPolling( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ BOOLEAN AllowDriveToSleep);
SCSIPORT_APIPVPBNTAPIClassGetVpb( _In_ PDEVICE_OBJECT DeviceObject);
SCSIPORT_APINTSTATUSNTAPIClassSpinDownPowerHandler( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp);
NTSTATUSNTAPIClassStopUnitPowerHandler( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp);
_IRQL_requires_max_(PASSIVE_LEVEL)NTSTATUSNTAPIClassSetFailurePredictionPoll( _Inout_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ FAILURE_PREDICTION_METHOD FailurePredictionMethod, _In_ ULONG PollingPeriod);
_IRQL_requires_max_(DISPATCH_LEVEL)VOIDNTAPIClassNotifyFailurePredicted( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_reads_bytes_(BufferSize) PUCHAR Buffer, _In_ ULONG BufferSize, _In_ BOOLEAN LogError, _In_ ULONG UniqueErrorValue, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APIVOIDNTAPIClassAcquireChildLock( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension);
SCSIPORT_APIVOIDNTAPIClassReleaseChildLock( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension);
IO_COMPLETION_ROUTINE ClassSignalCompletion;
VOIDNTAPIClassSendStartUnit( _In_ PDEVICE_OBJECT DeviceObject);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APINTSTATUSNTAPIClassRemoveDevice( _In_ PDEVICE_OBJECT DeviceObject, _In_ UCHAR RemoveType);
SCSIPORT_APINTSTATUSNTAPIClassAsynchronousCompletion( PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Event);
SCSIPORT_APIVOIDNTAPIClassCheckMediaState( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension);
SCSIPORT_APINTSTATUSNTAPIClassCheckVerifyComplete( PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APIVOIDNTAPIClassSetMediaChangeState( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ MEDIA_CHANGE_DETECTION_STATE State, _In_ BOOLEAN Wait);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APIVOIDNTAPIClassEnableMediaChangeDetection( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APIVOIDNTAPIClassDisableMediaChangeDetection( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension);
_IRQL_requires_max_(PASSIVE_LEVEL)SCSIPORT_APIVOIDNTAPIClassCleanupMediaChangeDetection( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension);
_IRQL_requires_max_(PASSIVE_LEVEL)VOIDNTAPIClassGetDeviceParameter( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_opt_ PWSTR SubkeyName, _In_ PWSTR ParameterName, _Inout_ PULONG ParameterValue);
_IRQL_requires_max_(PASSIVE_LEVEL)NTSTATUSNTAPIClassSetDeviceParameter( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_opt_ PWSTR SubkeyName, _In_ PWSTR ParameterName, _In_ ULONG ParameterValue);
#if (NTDDI_VERSION >= NTDDI_VISTA)
_IRQL_requires_max_(PASSIVE_LEVEL)PFILE_OBJECT_EXTENSIONNTAPIClassGetFsContext( _In_ PCOMMON_DEVICE_EXTENSION CommonExtension, _In_ PFILE_OBJECT FileObject);
_IRQL_requires_max_(DISPATCH_LEVEL)VOIDNTAPIClassSendNotification( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ const GUID *Guid, _In_ ULONG ExtraDataSize, _In_reads_bytes_opt_(ExtraDataSize) PVOID ExtraData);
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
FORCEINLINEUCHARGET_FDO_EXTENSON_SENSE_DATA_LENGTH ( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension){ UCHAR SenseDataLength = 0;
if (FdoExtension->SenseData != NULL) {#if (NTDDI_VERSION >= NTDDI_WIN8) if (FdoExtension->SenseDataLength > 0) { SenseDataLength = FdoExtension->SenseDataLength; } else { // For backward compatibility with Windows 7 and earlier SenseDataLength = SENSE_BUFFER_SIZE; }#else SenseDataLength = SENSE_BUFFER_SIZE;#endif }
return SenseDataLength;}
static __inlineBOOLEANPORT_ALLOCATED_SENSE( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ PSCSI_REQUEST_BLOCK Srb){ return ((BOOLEAN)((TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_PORT_DRIVER_ALLOCSENSE) && TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)) && (Srb->SenseInfoBuffer != FdoExtension->SenseData)));}
static __inlineVOIDFREE_PORT_ALLOCATED_SENSE_BUFFER( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ PSCSI_REQUEST_BLOCK Srb){ ASSERT(TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_PORT_DRIVER_ALLOCSENSE)); ASSERT(TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)); ASSERT(Srb->SenseInfoBuffer != FdoExtension->SenseData);
ExFreePool(Srb->SenseInfoBuffer); Srb->SenseInfoBuffer = FdoExtension->SenseData; Srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE; CLEAR_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER); return;}
_IRQL_requires_max_(PASSIVE_LEVEL)typedef VOID(NTAPI *PCLASS_SCAN_FOR_SPECIAL_HANDLER)( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ ULONG_PTR Data);
_IRQL_requires_max_(PASSIVE_LEVEL)VOIDNTAPIClassScanForSpecial( _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ CLASSPNP_SCAN_FOR_SPECIAL_INFO DeviceList[], _In_ PCLASS_SCAN_FOR_SPECIAL_HANDLER Function);