35 #include "scratch.tmh" 43 #pragma alloc_text(PAGE, ScratchBuffer_Deallocate) 44 #pragma alloc_text(PAGE, ScratchBuffer_Allocate) 45 #pragma alloc_text(PAGE, ScratchBuffer_SetupSrb) 46 #pragma alloc_text(PAGE, ScratchBuffer_ExecuteCdbEx) 52 ScratchBuffer_Deallocate(
73 NT_ASSERT(DeviceExtension->ScratchContext.ScratchInUse == 0);
75 if (DeviceExtension->ScratchContext.ScratchHistory !=
NULL)
77 ExFreePool(DeviceExtension->ScratchContext.ScratchHistory);
78 DeviceExtension->ScratchContext.ScratchHistory =
NULL;
80 if (DeviceExtension->ScratchContext.ScratchSense !=
NULL)
82 ExFreePool(DeviceExtension->ScratchContext.ScratchSense);
83 DeviceExtension->ScratchContext.ScratchSense =
NULL;
85 if (DeviceExtension->ScratchContext.ScratchSrb !=
NULL)
87 ExFreePool(DeviceExtension->ScratchContext.ScratchSrb);
88 DeviceExtension->ScratchContext.ScratchSrb =
NULL;
90 if (DeviceExtension->ScratchContext.ScratchBufferSize != 0)
92 DeviceExtension->ScratchContext.ScratchBufferSize = 0;
94 if (DeviceExtension->ScratchContext.ScratchBufferMdl !=
NULL)
96 IoFreeMdl(DeviceExtension->ScratchContext.ScratchBufferMdl);
97 DeviceExtension->ScratchContext.ScratchBufferMdl =
NULL;
99 if (DeviceExtension->ScratchContext.ScratchBuffer !=
NULL)
101 ExFreePool(DeviceExtension->ScratchContext.ScratchBuffer);
102 DeviceExtension->ScratchContext.ScratchBuffer =
NULL;
105 if (DeviceExtension->ScratchContext.PartialMdl !=
NULL)
107 IoFreeMdl(DeviceExtension->ScratchContext.PartialMdl);
108 DeviceExtension->ScratchContext.PartialMdl =
NULL;
111 if (DeviceExtension->ScratchContext.ScratchRequest !=
NULL)
113 PIRP irp = WdfRequestWdmGetIrp(DeviceExtension->ScratchContext.ScratchRequest);
118 WdfObjectDelete(DeviceExtension->ScratchContext.ScratchRequest);
119 DeviceExtension->ScratchContext.ScratchRequest =
NULL;
127 ScratchBuffer_Allocate(
150 NT_ASSERT(DeviceExtension->ScratchContext.ScratchInUse == 0);
153 if ((DeviceExtension->ScratchContext.ScratchBuffer !=
NULL) &&
154 (DeviceExtension->ScratchContext.ScratchBufferMdl !=
NULL) &&
155 (DeviceExtension->ScratchContext.ScratchBufferSize != 0) &&
156 (DeviceExtension->ScratchContext.ScratchRequest !=
NULL) &&
157 (DeviceExtension->ScratchContext.ScratchSrb !=
NULL) &&
158 (DeviceExtension->ScratchContext.ScratchHistory !=
NULL) &&
159 (DeviceExtension->ScratchContext.PartialMdl !=
NULL)
166 NT_ASSERT(DeviceExtension->DeviceAdditionalData.MaxPageAlignedTransferBytes != 0);
169 NT_ASSERT(DeviceExtension->ScratchContext.ScratchBuffer ==
NULL);
170 NT_ASSERT(DeviceExtension->ScratchContext.ScratchBufferMdl ==
NULL);
171 NT_ASSERT(DeviceExtension->ScratchContext.ScratchBufferSize == 0);
172 NT_ASSERT(DeviceExtension->ScratchContext.ScratchRequest ==
NULL);
173 NT_ASSERT(DeviceExtension->ScratchContext.PartialMdl ==
NULL);
176 DeviceExtension->ScratchContext.ScratchBufferSize =
min(DeviceExtension->DeviceAdditionalData.MaxPageAlignedTransferBytes, (64*1024));
182 DeviceExtension->ScratchContext.ScratchBufferSize,
184 if (DeviceExtension->ScratchContext.ScratchBuffer ==
NULL)
188 "Failed to allocate scratch buffer of %x bytes\n",
189 DeviceExtension->ScratchContext.ScratchBufferSize
192 else if (
BYTE_OFFSET(DeviceExtension->ScratchContext.ScratchBuffer) != 0)
196 "Allocation of %x bytes non-paged pool was not " 197 "allocated on page boundary? STATUS_INTERNAL_ERROR\n",
198 DeviceExtension->ScratchContext.ScratchBufferSize
206 DeviceExtension->ScratchContext.ScratchBufferMdl =
IoAllocateMdl(DeviceExtension->ScratchContext.ScratchBuffer,
207 DeviceExtension->ScratchContext.ScratchBufferSize,
209 if (DeviceExtension->ScratchContext.ScratchBufferMdl ==
NULL)
213 "Failed to allocate MDL for %x byte buffer\n",
214 DeviceExtension->ScratchContext.ScratchBufferSize
230 status = WdfRequestCreate(&attributes,
231 DeviceExtension->IoTarget,
232 &DeviceExtension->ScratchContext.ScratchRequest);
235 (DeviceExtension->ScratchContext.ScratchRequest ==
NULL))
239 "Failed to allocate scratch MDL \n"));
250 if (DeviceExtension->ScratchContext.ScratchSrb ==
NULL)
254 "Failed to allocate scratch SRB\n"));
265 if (DeviceExtension->ScratchContext.ScratchSense ==
NULL)
269 "Failed to allocate scratch sense data\n" 283 if (DeviceExtension->ScratchContext.ScratchHistory ==
NULL)
287 "Failed to allocate scratch history buffer\n" 293 RtlZeroMemory(DeviceExtension->ScratchContext.ScratchHistory, allocationSize);
294 DeviceExtension->ScratchContext.ScratchHistory->TotalHistoryCount = 20;
301 ULONG transferLength = 0;
303 status = RtlULongAdd(DeviceExtension->DeviceAdditionalData.MaxPageAlignedTransferBytes,
PAGE_SIZE, &transferLength);
306 DeviceExtension->ScratchContext.PartialMdlIsBuilt =
FALSE;
312 if (DeviceExtension->ScratchContext.PartialMdl ==
NULL)
316 "Failed to allocate MDL for %x byte buffer\n",
317 DeviceExtension->ScratchContext.ScratchBufferSize
322 NT_ASSERT(DeviceExtension->ScratchContext.PartialMdl->Size >=
335 ScratchBuffer_Deallocate(DeviceExtension);
368 NT_ASSERT(DeviceExtension->ScratchContext.ScratchHistory !=
NULL);
369 NT_ASSERT(DeviceExtension->ScratchContext.ScratchSense !=
NULL);
370 NT_ASSERT(DeviceExtension->ScratchContext.ScratchSrb !=
NULL);
371 NT_ASSERT(DeviceExtension->ScratchContext.ScratchRequest !=
NULL);
372 NT_ASSERT(DeviceExtension->ScratchContext.ScratchBufferSize != 0);
373 NT_ASSERT(DeviceExtension->ScratchContext.ScratchBuffer !=
NULL);
374 NT_ASSERT(DeviceExtension->ScratchContext.ScratchBufferMdl !=
NULL);
375 NT_ASSERT(DeviceExtension->ScratchContext.ScratchInUse != 0);
377 irp = WdfRequestWdmGetIrp(DeviceExtension->ScratchContext.ScratchRequest);
379 if (ResetRequestHistory)
381 PSRB_HISTORY history = DeviceExtension->ScratchContext.ScratchHistory;
387 history->UsedHistoryCount = 0;
400 status = WdfRequestReuse(DeviceExtension->ScratchContext.ScratchRequest, &reuseParams);
405 WdfRequestSetCompletionRoutine(DeviceExtension->ScratchContext.ScratchRequest,
NULL,
NULL);
407 status = WdfIoTargetFormatRequestForInternalIoctlOthers(DeviceExtension->IoTarget,
408 DeviceExtension->ScratchContext.ScratchRequest,
416 "ScratchBuffer_ResetItems: WdfIoTargetFormatRequestForInternalIoctlOthers failed, %!STATUS!\n",
450 PCDROM_REQUEST_CONTEXT requestContext = RequestGetContext(DeviceExtension->ScratchContext.ScratchRequest);
461 DeviceExtension->ScratchContext.NumRetries = 0;
477 WdfRequestSetCompletionRoutine(DeviceExtension->ScratchContext.ScratchRequest,
512 WDFREQUEST originalRequest =
NULL;
530 requestContext = RequestGetContext(originalRequest);
537 status = WdfRequestUnmarkCancelable(originalRequest);
661 "WdfRequestSend: %lx\n",
692 if (retryIn100nsUnits == 0)
734 t.QuadPart = -retryIn100nsUnits;
811 ScratchBuffer_SetupSrb(
836 WDFREQUEST
request = DeviceExtension->ScratchContext.ScratchRequest;
866 irp->MdlAddress = DeviceExtension->ScratchContext.ScratchBufferMdl;
868 srb->
DataBuffer = DeviceExtension->ScratchContext.ScratchBuffer;
886 srb->
SrbFlags = DeviceExtension->SrbFlags;
933 PSRB_HISTORY history = DeviceExtension->ScratchContext.ScratchHistory;
942 if (SynchronousSrb || SrbHistoryItem !=
NULL)
945 NT_ASSERT( history->UsedHistoryCount <= history->TotalHistoryCount );
948 if (history->UsedHistoryCount == history->TotalHistoryCount )
951 NT_ASSERT( history->UsedHistoryCount < history->TotalHistoryCount );
955 NT_ASSERT( history->UsedHistoryCount < history->TotalHistoryCount );
958 history->UsedHistoryCount++;
961 item = &( history->History[ history->UsedHistoryCount-1 ] );
963 if (SrbHistoryItem !=
NULL)
965 *SrbHistoryItem =
item;
977 PCDROM_REQUEST_CONTEXT requestContext = RequestGetContext(DeviceExtension->ScratchContext.ScratchRequest);
981 requestCancelled = WdfRequestIsCanceled(requestContext->
OriginalRequest);
985 if (!requestCancelled)
988 DeviceExtension->ScratchContext.ScratchRequest,
989 DeviceExtension->IoTarget,
1071 for (
j =
i+1; (toMatch->
ClassDriverUse != 0xFF) && (j < RequestHistory->UsedHistoryCount);
j++)
1156 BOOLEAN foundPartiallyCompressedItem =
1159 BOOLEAN foundUncompressedItem =
1175 "History data has compressed history following uncompressed history " 1176 "for srbstatus/sense/asc/ascq of %02x/%02x/%02x/%02x at indices %d (%08x) and %d (%08x)\n",
1177 srbStatus, sense, asc, ascq,
1182 else if (foundPartiallyCompressedItem && (found->
ClassDriverUse == 0xFF))
1185 "History data has fully compressed history following partially compressed history " 1186 "for srbstatus/sense/asc/ascq of %02x/%02x/%02x/%02x at indices %d (%08x) and %d (%08x)\n",
1187 srbStatus, sense, asc, ascq,
1196 foundUncompressedItem =
TRUE;
1200 foundPartiallyCompressedItem =
TRUE;
1246 ULONG numTransferBlocks;
1250 PIRP irp = WdfRequestWdmGetIrp(DeviceExtension->ScratchContext.ScratchRequest);
1253 PCDROM_REQUEST_CONTEXT requestContext = RequestGetContext(DeviceExtension->ScratchContext.ScratchRequest);
1259 numTransferBlocks =
RequiredLength >> DeviceExtension->SectorShift;
1288 if (logicalBlockAddr.QuadPart > 0xFFFFFFFF)
1309 cdb->
READ12.Streaming = 1;
1326 cdb->
CDB10.LogicalBlockByte0 = ((
PFOUR_BYTE)&logicalBlockAddr.LowPart)->Byte3;
1327 cdb->
CDB10.LogicalBlockByte1 = ((
PFOUR_BYTE)&logicalBlockAddr.LowPart)->Byte2;
1328 cdb->
CDB10.LogicalBlockByte2 = ((
PFOUR_BYTE)&logicalBlockAddr.LowPart)->Byte1;
1329 cdb->
CDB10.LogicalBlockByte3 = ((
PFOUR_BYTE)&logicalBlockAddr.LowPart)->Byte0;
1330 cdb->
CDB10.TransferBlocksMsb = ((
PFOUR_BYTE)&numTransferBlocks)->Byte1;
1331 cdb->
CDB10.TransferBlocksLsb = ((
PFOUR_BYTE)&numTransferBlocks)->Byte0;
1337 srb->
SrbFlags = DeviceExtension->SrbFlags;
1353 if (UsePartialMdl ==
FALSE)
1355 irp->MdlAddress = originalIrp->MdlAddress;
1359 if (DeviceExtension->ScratchContext.PartialMdlIsBuilt !=
FALSE)
1365 DeviceExtension->ScratchContext.PartialMdlIsBuilt =
TRUE;
1366 irp->MdlAddress = DeviceExtension->ScratchContext.PartialMdl;
1382 ScratchBuffer_ExecuteCdbEx(
1419 ULONG timesAlreadyRetried = 0;
1441 (DeviceExtension->ScratchContext.ScratchSrb->InternalStatus ==
STATUS_CANCELLED))
1443 shouldRetry =
FALSE;
1449 timesAlreadyRetried,
1451 &retryIn100nsUnits);
1455 t.QuadPart = -retryIn100nsUnits;
1456 timesAlreadyRetried++;
#define IOCTL_SCSI_EXECUTE_OUT
BOOLEAN RequestIsRealtimeStreaming(_In_ WDFREQUEST Request, _In_ BOOLEAN IsReadRequest)
PSRB_HISTORY_ITEM SrbHistoryItem
return STATUS_NOT_SUPPORTED
LARGE_INTEGER StartingOffset
FORCEINLINE VOID ScratchBuffer_EndUse(_Inout_ PCDROM_DEVICE_EXTENSION DeviceExtension)
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
CDROM_SCRATCH_READ_WRITE_CONTEXT ScratchReadWriteContext
#define STATUS_INSUFFICIENT_RESOURCES
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
struct _SRB_HISTORY_ITEM SRB_HISTORY_ITEM
_In_ PFCB _In_ LONGLONG StartingOffset
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN GetDataFromDevice
#define SRB_FLAGS_NO_QUEUE_FREEZE
#define UNREFERENCED_PARAMETER(P)
VOID NTAPI MmBuildMdlForNonPagedPool(IN PMDL Mdl)
#define REVERSE_BYTES(Destination, Source)
struct _CDB::_READ12 READ12
NTSYSAPI ULONG __cdecl DbgPrintEx(_In_ ULONG ComponentId, _In_ ULONG Level, _In_z_ _Printf_format_string_ PCSTR Format,...)
NTSTATUS RequestSend(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ WDFREQUEST Request, _In_ WDFIOTARGET IoTarget, _In_ ULONG Flags, _Out_opt_ PBOOLEAN RequestSent)
struct _CDB::_WRITE12 WRITE12
VOID ScratchBuffer_SetupReadWriteSrb(_Inout_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ WDFREQUEST OriginalRequest, _In_ LARGE_INTEGER StartingOffset, _In_ ULONG RequiredLength, _Inout_updates_bytes_(RequiredLength) UCHAR *DataBuffer, _In_ BOOLEAN IsReadRequest, _In_ BOOLEAN UsePartialMdl)
VOID ScratchBuffer_ResetItems(_Inout_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ BOOLEAN ResetRequestHistory)
EVT_WDF_REQUEST_COMPLETION_ROUTINE ScratchBuffer_ReadWriteCompletionRoutine
struct _SCSI_REQUEST_BLOCK * NextSrb
struct _CDB::_CDB10 CDB10
struct _SRB_HISTORY SRB_HISTORY
NTSTATUS ScratchBuffer_PerformNextReadWrite(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ BOOLEAN FirstTry)
_In_opt_ WDFREQUEST _In_ ULONG MaximumTransferLength
#define SRB_FLAGS_DATA_IN
#define SRB_STATUS(Status)
#define WdfObjectReference(Handle)
#define SENSE_BUFFER_SIZE
#define RtlMoveMemory(Destination, Source, Length)
#define WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
struct _CDROM_DEVICE_EXTENSION * PCDROM_DEVICE_EXTENSION
VOID CompressSrbHistoryData(_Inout_ PSRB_HISTORY RequestHistory)
#define STATUS_INTERNAL_ERROR
VOID NTAPI IoBuildPartialMdl(IN PMDL SourceMdl, IN PMDL TargetMdl, IN PVOID VirtualAddress, IN ULONG Length)
VOID RequestCompletion(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ WDFREQUEST Request, _In_ NTSTATUS Status, _In_ ULONG_PTR Information)
_In_opt_ PIRP _In_ PSCSI_REQUEST_BLOCK _In_ UCHAR _In_ ULONG _In_ ULONG _In_opt_ SRB_HISTORY * RequestHistory
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
BOOLEAN ReadWriteIsCompleted
#define STATUS_INTEGER_OVERFLOW
VOID ValidateSrbHistoryDataPresumptions(_In_ SRB_HISTORY const *RequestHistory)
#define TRACE_LEVEL_FATAL
NTSTATUS NTAPI KeDelayExecutionThread(IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Interval OPTIONAL)
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
FORCEINLINE VOID WDF_REQUEST_REUSE_PARAMS_INIT(_Out_ PWDF_REQUEST_REUSE_PARAMS Params, _In_ ULONG Flags, _In_ NTSTATUS Status)
#define WdfObjectDereference(Handle)
#define SRB_STATUS_ABORTED
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
VOID NTAPI KeQueryTickCount(IN PLARGE_INTEGER TickCount)
#define TEST_FLAG(Flags, Bit)
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB _In_ UCHAR OprationLength
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
BOOLEAN ReadWriteRetryInitialized
#define _Inout_updates_bytes_(s)
UCHAR AdditionalSenseCodeQualifier
CDROM_SCRATCH_CONTEXT ScratchContext
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
#define SRB_CLASS_FLAGS_PAGING
LARGE_INTEGER TickCountCompleted
BOOLEAN NTAPI KeCancelTimer(IN OUT PKTIMER Timer)
WDFREQUEST ScratchRequest
EVT_WDF_REQUEST_CANCEL ScratchBuffer_ReadWriteEvtRequestCancel
#define NT_SUCCESS(StatCode)
#define KeAcquireSpinLock(sl, irql)
#define SRB_FLAGS_DISABLE_SYNCH_TRANSFER
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB Cdb
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
VOID NTAPI IoFreeMdl(PMDL Mdl)
#define ExAllocatePoolWithTag(hernya, size, tag)
PSCSI_REQUEST_BLOCK ScratchSrb
#define BYTES_TO_PAGES(Size)
#define SRB_FLAGS_NO_DATA_TRANSFER
BOOLEAN RequestSenseInfoInterpretForScratchBuffer(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ ULONG RetriedCount, _Out_ NTSTATUS *Status, _Out_ _Deref_out_range_(0, MAXIMUM_RETRY_FOR_SINGLE_IO_IN_100NS_UNITS) LONGLONG *RetryIntervalIn100ns)
#define CDROM_TAG_SCRATCH
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB _In_ UCHAR _In_ ULONG TimeoutValue
PCDROM_DEVICE_EXTENSION DeviceExtension
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define MmPrepareMdlForReuse(_Mdl)
_In_ PSCSI_REQUEST_BLOCK _In_opt_ PVOID _In_ ULONG _In_ BOOLEAN _In_opt_ WDFREQUEST OriginalRequest
#define IOCTL_SCSI_EXECUTE_IN
#define TRACE_LEVEL_ERROR
#define TRACE_LEVEL_WARNING
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
PMDL NTAPI IoAllocateMdl(IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN PIRP Irp)
#define IOCTL_SCSI_EXECUTE_NONE
#define Int64ShrlMod32(a, b)
UCHAR SenseInfoBufferLength
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define DPFLTR_ERROR_LEVEL
#define SRB_SIMPLE_TAG_REQUEST
#define SCSI_REQUEST_BLOCK_SIZE
ULONG MillisecondsDelayOnRetry
_In_ ULONG _Out_opt_ PULONG RequiredLength
#define SRB_FLAGS_DATA_OUT
#define KeReleaseSpinLock(sl, irql)
#define SRB_FLAGS_ADAPTER_CACHE_ENABLE
#define FDO_HACK_NO_STREAMING
struct _SENSE_DATA * PSENSE_DATA
ULONG_PTR ClassDriverUse[4]
VOID NTAPI ScratchBuffer_ReadWriteTimerRoutine(struct _KDPC *Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
#define SRB_FUNCTION_EXECUTE_SCSI
KSPIN_LOCK ReadWriteCancelSpinLock
#define RtlZeroMemory(Destination, Length)
UCHAR AdditionalSenseLength
#define SRB_STATUS_SUCCESS
#define RtlCopyMemory(Destination, Source, Length)
_In_opt_ WDFREQUEST _In_ ULONG TransferSize
_IRQL_requires_max_(APC_LEVEL)
UCHAR AdditionalSenseCode
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
static SERVICE_STATUS status
SENSE_DATA NormalizedSenseData
NTSTATUS ScratchBuffer_SendSrb(_Inout_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ BOOLEAN SynchronousSrb, _When_(SynchronousSrb, _Pre_null_) _When_(!SynchronousSrb, _In_opt_) PSRB_HISTORY_ITEM *SrbHistoryItem)
#define SET_FLAG(Flags, Bit)
#define IRP_SYNCHRONOUS_PAGING_IO
WDFREQUEST OriginalRequest
_In_opt_ PVOID DeferredContext