8549 #if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) 8555 PSTORAGE_HW_FIRMWARE_DOWNLOAD firmwareDownload = (PSTORAGE_HW_FIRMWARE_DOWNLOAD)
Irp->AssociatedIrp.SystemBuffer;
8570 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
sizeof(STORAGE_HW_FIRMWARE_DOWNLOAD)) {
8573 goto Exit_Firmware_Download;
8579 if ((firmwareDownload->Version <
sizeof(STORAGE_HW_FIRMWARE_DOWNLOAD)) ||
8580 (firmwareDownload->Size > irpStack->
Parameters.DeviceIoControl.InputBufferLength) ||
8581 ((firmwareDownload->BufferSize +
FIELD_OFFSET(STORAGE_HW_FIRMWARE_DOWNLOAD, ImageBuffer)) > firmwareDownload->Size)) {
8584 goto Exit_Firmware_Download;
8592 goto Exit_Firmware_Download;
8599 if (commonExtension->
IsFdo && (fdoExtension->FunctionSupportInfo ==
NULL)) {
8602 goto Exit_Firmware_Download;
8608 if (!commonExtension->
IsFdo) {
8612 if ((firmwareDownload->Flags & STORAGE_HW_FIRMWARE_REQUEST_FLAG_CONTROLLER) != 0) {
8629 if (fdoExtension->FunctionSupportInfo->HwFirmwareInfo ==
NULL) {
8630 if (fdoExtension->FunctionSupportInfo->HwFirmwareGetInfoSupport ==
NotSupported) {
8632 goto Exit_Firmware_Download;
8641 goto Exit_Firmware_Download;
8649 if (fdoExtension->FunctionSupportInfo->HwFirmwareInfo ==
NULL) {
8650 if (fdoExtension->FunctionSupportInfo->HwFirmwareGetInfoSupport ==
NotSupported) {
8656 goto Exit_Firmware_Download;
8669 if ((fdoExtension->FunctionSupportInfo->HwFirmwareInfo->SupportUpgrade ==
FALSE) ||
8670 (fdoExtension->FunctionSupportInfo->HwFirmwareInfo->ImagePayloadAlignment == 0)) {
8672 goto Exit_Firmware_Download;
8678 for (
i = 0;
i < fdoExtension->FunctionSupportInfo->HwFirmwareInfo->SlotCount;
i++) {
8679 if (fdoExtension->FunctionSupportInfo->HwFirmwareInfo->Slot[
i].SlotNumber == firmwareDownload->Slot) {
8684 if ((
i >= fdoExtension->FunctionSupportInfo->HwFirmwareInfo->SlotCount) ||
8685 (fdoExtension->FunctionSupportInfo->HwFirmwareInfo->Slot[
i].ReadOnly ==
TRUE)) {
8690 goto Exit_Firmware_Download;
8697 if ((firmwareDownload->BufferSize == 0) ||
8698 ((firmwareDownload->BufferSize % fdoExtension->FunctionSupportInfo->HwFirmwareInfo->ImagePayloadAlignment) != 0) ||
8699 (firmwareDownload->BufferSize > fdoExtension->FunctionSupportInfo->HwFirmwareInfo->ImagePayloadMaxSize) ||
8700 (firmwareDownload->BufferSize > fdoExtension->
AdapterDescriptor->MaximumTransferLength) ||
8701 ((firmwareDownload->Offset % fdoExtension->FunctionSupportInfo->HwFirmwareInfo->ImagePayloadAlignment) != 0) ||
8702 (firmwareDownload->Offset > 0xFFFFFF) ||
8703 (firmwareDownload->BufferSize > 0xFFFFFF)) {
8706 goto Exit_Firmware_Download;
8713 if (((
ULONG_PTR)firmwareDownload->ImageBuffer % fdoExtension->FunctionSupportInfo->HwFirmwareInfo->ImagePayloadAlignment) != 0) {
8717 bufferSize =
ALIGN_UP_BY(firmwareDownload->BufferSize, fdoExtension->FunctionSupportInfo->HwFirmwareInfo->ImagePayloadAlignment);
8728 #pragma prefast(suppress:6014, "The allocated memory that firmwareImageBuffer points to will be freed in ClassHwFirmwareDownloadComplete().") 8732 if (firmwareImageBuffer ==
NULL) {
8734 goto Exit_Firmware_Download;
8739 RtlCopyMemory(firmwareImageBuffer, firmwareDownload->ImageBuffer, (
ULONG)firmwareDownload->BufferSize);
8746 firmwareImageBuffer = firmwareDownload->ImageBuffer;
8759 if (firmwareImageBuffer != firmwareDownload->ImageBuffer) {
8763 goto Exit_Firmware_Download;
8771 irp2->Tail.Overlay.Thread =
Irp->Tail.Overlay.Thread;
8779 newStack->Parameters.Others.Argument1 =
Irp;
8787 ClassHwFirmwareDownloadComplete,
8788 (firmwareImageBuffer != firmwareDownload->ImageBuffer) ? firmwareImageBuffer :
NULL,
8798 newStack->Flags = irpStack->
Flags;
8814 cdb->WRITE_BUFFER.Mode = SCSI_WRITE_BUFFER_MODE_DOWNLOAD_MICROCODE_WITH_OFFSETS_SAVE_DEFER_ACTIVATE;
8815 cdb->WRITE_BUFFER.ModeSpecific = 0;
8816 cdb->WRITE_BUFFER.BufferID = firmwareDownload->Slot;
8818 cdb->WRITE_BUFFER.BufferOffset[0] = *((
PCHAR)&firmwareDownload->Offset + 2);
8819 cdb->WRITE_BUFFER.BufferOffset[1] = *((
PCHAR)&firmwareDownload->Offset + 1);
8820 cdb->WRITE_BUFFER.BufferOffset[2] = *((
PCHAR)&firmwareDownload->Offset);
8844 firmwareImageBuffer,
8852 if (firmwareImageBuffer != firmwareDownload->ImageBuffer) {
8865 goto Exit_Firmware_Download;
8870 Exit_Firmware_Download:
8891 #endif // #if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD)
return STATUS_NOT_SUPPORTED
#define STATUS_INSUFFICIENT_RESOURCES
#define ClassAcquireRemoveLock(devobj, tag)
#define STATUS_INFO_LENGTH_MISMATCH
#define SCSIOP_WRITE_DATA_BUFF
#define SRB_FLAGS_NO_QUEUE_FREEZE
#define STATUS_INVALID_PARAMETER
#define CLASSPNP_POOL_TAG_FIRMWARE
FORCEINLINE PCDB SrbGetCdb(_In_ PVOID Srb)
VOID FASTCALL KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, IN PKLOCK_QUEUE_HANDLE LockHandle)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
FORCEINLINE VOID IoCopyCurrentIrpStackLocationToNext(_Inout_ PIRP Irp)
_In_ PDEVICE_OBJECT DeviceObject
return STATUS_NOT_IMPLEMENTED
#define FREE_POOL(_PoolPtr)
VOID NTAPI ClassReleaseRemoveLock(_In_ PDEVICE_OBJECT DeviceObject, _In_opt_ PIRP Tag)
FORCEINLINE VOID SrbSetCdbLength(_In_ PVOID Srb, _In_ UCHAR CdbLength)
VOID FASTCALL KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle)
#define NT_SUCCESS(StatCode)
FORCEINLINE VOID SrbSetTimeOutValue(_In_ PVOID Srb, _In_ ULONG TimeOutValue)
PSTORAGE_ADAPTER_DESCRIPTOR AdapterDescriptor
#define STATUS_UNSUCCESSFUL
#define ExAllocatePoolWithTag(hernya, size, tag)
__inline BOOLEAN ClassDeviceHwFirmwareIsPortDriverSupported(_In_ PDEVICE_OBJECT DeviceObject)
FORCEINLINE VOID SrbSetRequestAttribute(_In_ PVOID Srb, _In_ UCHAR RequestAttribute)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
NTSTATUS ClasspGetHwFirmwareInfo(_In_ PDEVICE_OBJECT DeviceObject)
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 FIELD_OFFSET(t, f)
PDEVICE_OBJECT LowerDeviceObject
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define SRB_HEAD_OF_QUEUE_TAG_REQUEST
VOID NTAPI IoFreeIrp(IN PIRP Irp)
FORCEINLINE VOID SrbSetSrbFlags(_In_ PVOID Srb, _In_ ULONG Flags)
#define RtlZeroMemory(Destination, Length)
#define ALIGN_UP_BY(size, align)
#define RtlCopyMemory(Destination, Source, Length)
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
IN PSCSI_REQUEST_BLOCK Srb
SCSIPORT_API NTSTATUS NTAPI ClassSendSrbAsynchronous(_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)
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
VOID NTAPI ClassCompleteRequest(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ CCHAR PriorityBoost)
static SERVICE_STATUS status
FORCEINLINE VOID IoSetNextIrpStackLocation(_Inout_ PIRP Irp)
#define CDB10GENERIC_LENGTH
#define SRB_FLAGS_QUEUE_ACTION_ENABLE