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)
52ScratchBuffer_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;
127ScratchBuffer_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;
811ScratchBuffer_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;
1382ScratchBuffer_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 DPFLTR_ERROR_LEVEL
_In_ PFCB _In_ LONGLONG StartingOffset
struct _CDROM_DEVICE_EXTENSION * PCDROM_DEVICE_EXTENSION
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_ PSCSI_REQUEST_BLOCK _In_opt_ PVOID _In_ ULONG _In_ BOOLEAN _In_opt_ WDFREQUEST OriginalRequest
NTSTATUS RequestSend(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ WDFREQUEST Request, _In_ WDFIOTARGET IoTarget, _In_ ULONG Flags, _Out_opt_ PBOOLEAN RequestSent)
VOID RequestCompletion(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ WDFREQUEST Request, _In_ NTSTATUS Status, _In_ ULONG_PTR Information)
#define SRB_CLASS_FLAGS_PAGING
#define TEST_FLAG(Flags, Bit)
#define SET_FLAG(Flags, Bit)
#define FDO_HACK_NO_STREAMING
struct _SRB_HISTORY SRB_HISTORY
struct _SRB_HISTORY_ITEM SRB_HISTORY_ITEM
#define IOCTL_SCSI_EXECUTE_IN
struct _SENSE_DATA * PSENSE_DATA
#define IOCTL_SCSI_EXECUTE_OUT
#define IOCTL_SCSI_EXECUTE_NONE
#define SENSE_BUFFER_SIZE
_In_opt_ PIRP _In_ PSCSI_REQUEST_BLOCK _In_ UCHAR _In_ ULONG _In_ ULONG _In_opt_ SRB_HISTORY * RequestHistory
#define STATUS_NOT_SUPPORTED
#define NT_SUCCESS(StatCode)
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
BOOLEAN RequestIsRealtimeStreaming(_In_ WDFREQUEST Request, _In_ BOOLEAN IsReadRequest)
#define SCSI_REQUEST_BLOCK_SIZE
#define SRB_FUNCTION_EXECUTE_SCSI
#define SRB_FLAGS_DATA_OUT
#define SRB_STATUS_ABORTED
#define SRB_FLAGS_NO_DATA_TRANSFER
#define SRB_SIMPLE_TAG_REQUEST
#define SRB_FLAGS_DATA_IN
#define SRB_FLAGS_ADAPTER_CACHE_ENABLE
#define SRB_FLAGS_DISABLE_SYNCH_TRANSFER
#define SRB_STATUS(Status)
#define SRB_FLAGS_NO_QUEUE_FREEZE
#define SRB_STATUS_SUCCESS
#define _IRQL_requires_max_(irql)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define KeReleaseSpinLock(sl, irql)
#define KeAcquireSpinLock(sl, irql)
#define KeDelayExecutionThread(mode, foo, t)
#define KeInitializeSpinLock(sl)
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
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
VOID NTAPI IoBuildPartialMdl(IN PMDL SourceMdl, IN PMDL TargetMdl, IN PVOID VirtualAddress, IN ULONG Length)
#define DbgPrintEx(cmpid, lvl, fmt,...)
VOID NTAPI MmBuildMdlForNonPagedPool(IN PMDL Mdl)
#define _Inout_updates_bytes_(s)
#define Int64ShrlMod32(a, b)
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
#define UNREFERENCED_PARAMETER(P)
#define STATUS_INTERNAL_ERROR
#define STATUS_INTEGER_OVERFLOW
EVT_WDF_REQUEST_COMPLETION_ROUTINE ScratchBuffer_ReadWriteCompletionRoutine
VOID ScratchBuffer_ResetItems(_Inout_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ BOOLEAN ResetRequestHistory)
EVT_WDF_REQUEST_CANCEL ScratchBuffer_ReadWriteEvtRequestCancel
NTSTATUS ScratchBuffer_SendSrb(_Inout_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ BOOLEAN SynchronousSrb, _When_(SynchronousSrb, _Pre_null_) _When_(!SynchronousSrb, _In_opt_) PSRB_HISTORY_ITEM *SrbHistoryItem)
VOID ValidateSrbHistoryDataPresumptions(_In_ SRB_HISTORY const *RequestHistory)
NTSTATUS ScratchBuffer_PerformNextReadWrite(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ BOOLEAN FirstTry)
VOID CompressSrbHistoryData(_Inout_ PSRB_HISTORY RequestHistory)
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)
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB _In_ UCHAR _In_ ULONG TimeoutValue
FORCEINLINE VOID ScratchBuffer_EndUse(_Inout_ PCDROM_DEVICE_EXTENSION DeviceExtension)
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB Cdb
_In_opt_ WDFREQUEST _In_ ULONG MaximumTransferLength
_In_opt_ WDFREQUEST _In_ ULONG TransferSize
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB _In_ UCHAR OprationLength
KDEFERRED_ROUTINE ScratchBuffer_ReadWriteTimerRoutine
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN GetDataFromDevice
#define REVERSE_BYTES(Destination, Source)
#define KeQueryTickCount(CurrentCount)
#define TRACE_LEVEL_WARNING
#define TRACE_LEVEL_FATAL
#define TRACE_LEVEL_ERROR
CDROM_SCRATCH_CONTEXT ScratchContext
WDFREQUEST OriginalRequest
PCDROM_DEVICE_EXTENSION DeviceExtension
KSPIN_LOCK ReadWriteCancelSpinLock
BOOLEAN ReadWriteIsCompleted
BOOLEAN ReadWriteRetryInitialized
PSCSI_REQUEST_BLOCK ScratchSrb
CDROM_SCRATCH_READ_WRITE_CONTEXT ScratchReadWriteContext
WDFREQUEST ScratchRequest
PSRB_HISTORY_ITEM SrbHistoryItem
LARGE_INTEGER StartingOffset
struct _IO_STACK_LOCATION::@4024::@4046 Scsi
struct _IO_STACK_LOCATION::@1584::@1585 DeviceIoControl
union _IO_STACK_LOCATION::@1584 Parameters
UCHAR SenseInfoBufferLength
struct _SCSI_REQUEST_BLOCK * NextSrb
UCHAR AdditionalSenseLength
UCHAR AdditionalSenseCode
UCHAR AdditionalSenseCodeQualifier
LARGE_INTEGER TickCountCompleted
ULONG MillisecondsDelayOnRetry
SENSE_DATA NormalizedSenseData
ULONG_PTR ClassDriverUse[4]
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
BOOLEAN NTAPI KeCancelTimer(IN OUT PKTIMER Timer)
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define RtlMoveMemory(Destination, Source, Length)
#define STATUS_INSUFFICIENT_RESOURCES
struct _CDB::_CDB10 CDB10
struct _CDB::_READ12 READ12
struct _CDB::_WRITE12 WRITE12
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
#define WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
#define WdfObjectReference(Handle)
#define WdfObjectDereference(Handle)
@ WDF_REQUEST_SEND_OPTION_SYNCHRONOUS
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
@ WDF_REQUEST_REUSE_NO_FLAGS
FORCEINLINE VOID WDF_REQUEST_REUSE_PARAMS_INIT(_Out_ PWDF_REQUEST_REUSE_PARAMS Params, _In_ ULONG Flags, _In_ NTSTATUS Status)
_In_ ULONG _Out_opt_ PULONG RequiredLength
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define IRP_SYNCHRONOUS_PAGING_IO
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
_In_opt_ PVOID DeferredContext
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
#define BYTES_TO_PAGES(Size)
#define MmPrepareMdlForReuse(_Mdl)