ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

classpnp.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.