⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 authhost.c

📁 wince host 和 target PCI驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <windows.h> 
#include <winioctl.h>
#include <stdio.h>
#include "debug.h"
#include "aspi32ln.h"
#include "scsidefs.h"
#include "wnaspi32.h"
#include "dvdcom.h"
//***Constant definitions
#define DLLEXPORT __declspec(dllexport)

//***typedefs
typedef	int				dvdErrorCode;
typedef	int				dvdIntDrive;
typedef	int				dvdIntTitle;
typedef	unsigned char	Byte;
typedef	unsigned char  *PByte;


//***Global variables
static Byte	gbAGID;
HANDLE hVxD;

//***functions

BOOL LoadKernelDrv(DWORD *pdwErrorCode)
{
	DWORD dwByteReturn;
	DBGS("DLL:LoadKernelDrv\n\r");
	if ( GetVersion() < 0x80000000 )	//***WinNT
	{
		hVxD = CreateFile("\\\\.\\IDECTRL", GENERIC_READ|GENERIC_WRITE,
								 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
	}
	else	//***WIN95
	{
		hVxD = CreateFile("\\\\.\\IDECTRL.VXD", 0,0,0,
			   				CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0);
	}
	if (hVxD == INVALID_HANDLE_VALUE)
	{
		DBGS("AUTH32.DLL Error Can't find KERNEL driver\n\r");
		*pdwErrorCode = ERROR_NO_KERNEL_DRIVER;
		return FALSE;
	}
	else
		DBGS("AUTH32.DLL Connect to KERNEL driver OK\n\r");
	if (!DeviceIoControl(hVxD, IDEVXD_GETDVDDRIVESTATUS, 
						 pdwErrorCode, sizeof(DWORD),
						 pdwErrorCode, sizeof(DWORD),
						 &dwByteReturn,NULL))
	{
        DBGS("AUTH32.DLL Error DevIO GetDVDDRIVESTATUS FAILED\n\r");
        CloseHandle(hVxD);
        return FALSE;
	}
	*pdwErrorCode = ERROR_NONE;
	return TRUE;
}

BOOL CloseKernelDrv()
{
	DBGS("DLL:CloseKernelDrv\n\r");
	CloseHandle(hVxD);
	DeleteFile("\\\\.\\IDECTRL.VXD");	//***Just want to make sure that the
												//***VxD is going away for sure!
	return TRUE;
}



BOOL SendDeviceCommand(void *pData)
{
	DWORD dwByteReturn;
	SENDDEVICEBUFFER SendDevice;
	PSRB_ExecSCSICmd InqSRB = (PSRB_ExecSCSICmd)pData;
	SendDevice.pwCommandBuffer = (PWORD)InqSRB->CDBByte;
	SendDevice.pwDataBuffer = (PWORD)InqSRB->SRB_BufPointer;
	SendDevice.dwDataBufferSize = (DWORD)InqSRB->SRB_BufLen;
	if (!DeviceIoControl(hVxD, IDEVXD_SENDIDECOMMAND, 
						 &SendDevice, sizeof(SENDDEVICEBUFFER),
						 &SendDevice, sizeof(SENDDEVICEBUFFER),
						 &dwByteReturn, NULL))
		return FALSE;
	return TRUE;
}

BOOL ReadDeviceBuffer(void *pData)
{
	DWORD dwByteReturn;
	READDEVICEBUFFER ReadDevice;
	PSRB_ExecSCSICmd InqSRB = (PSRB_ExecSCSICmd)pData;
	ReadDevice.pwDataBuffer = (PWORD)InqSRB->SRB_BufPointer;
	ReadDevice.dwDataBufferSize = (DWORD)InqSRB->SRB_BufLen;
	if (!DeviceIoControl(hVxD, IDEVXD_READIDEBUFFER,
						 &ReadDevice, sizeof(READDEVICEBUFFER),
						 &ReadDevice, sizeof(READDEVICEBUFFER),
						 &dwByteReturn, NULL))
		return FALSE;
	return TRUE;
}

BOOL TestUnitReady(void)
{
	void	*InqSRB;		
	DBGS("TestUnitReady()\n\r");
	InqSRB = VirtualAlloc(NULL, ASPI_SRB_LEN, MEM_COMMIT, PAGE_READWRITE);
	if (!InqSRB)
		DBGS("TestUnitReady Allocation Failed ONE\n\r");
	memset(InqSRB, 0, ASPI_SRB_LEN);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Cmd		= SC_EXEC_SCSI_CMD;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Flags		= SRB_DIR_IN | SRB_POSTING;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer	= NULL;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufLen		= 0;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_SenseLen	= SENSE_LEN;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_CDBLen		= 12;
	
	if (!SendDeviceCommand(InqSRB))
	{
		DBGS("TestUnitReaddy SendDeviceCommand FAILED\n\r");
		VirtualFree(InqSRB, 0, MEM_RELEASE);
		return FALSE;
	}

	VirtualFree(InqSRB, 0, MEM_RELEASE);
	return TRUE;
}


BOOL SenseKey(void)
{
	void	*InqSRB;		
	BYTE	*pByte;
	BYTE	bSense, bASC, bASCQ;

	DBGS("SenseKey()\n\r");
	InqSRB = VirtualAlloc(NULL, ASPI_SRB_LEN, MEM_COMMIT, PAGE_READWRITE);
	if (!InqSRB)
		DBGS("SenseKey Allocation Failed ONE\n\r");
	memset(InqSRB, 0, ASPI_SRB_LEN);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Cmd		= SC_EXEC_SCSI_CMD;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Flags		= SRB_DIR_IN | SRB_POSTING;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer	= 
						VirtualAlloc(NULL, 18, MEM_COMMIT, PAGE_READWRITE);

	if (!((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer)
		DBGS("SenseKey Allocation Failed TWO\n\r");

	memset(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, 18);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufLen		= 18;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_SenseLen	= SENSE_LEN;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_CDBLen		= 12;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [0]	= 0x03;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [4]	= 18;
	
	if (!SendDeviceCommand(InqSRB))
	{
		DBGS("SenseKey SendDeviceCommand FAILED\n\r");
		VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
		VirtualFree(InqSRB, 0, MEM_RELEASE);
		return FALSE;
	}

	if (!ReadDeviceBuffer(InqSRB))
	{
		DBGS("SenseKey ReadDeviceBuffer FAILED\n\r");
		VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
		VirtualFree(InqSRB, 0, MEM_RELEASE);
		return FALSE;
	}
	pByte = (Byte *)((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer;
	bSense = *(pByte+2)&0xf;
	bASC = *(pByte+12);
	bASCQ = *(pByte+13);	

	if(bSense || bASC || bASCQ)
	{
		printf("DLL:SenseKey: sense = %x	 asc=%x  ascq=%x\n\r",bSense,bASC,bASCQ);
		VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
		VirtualFree(InqSRB, 0, MEM_RELEASE);
		return FALSE;
	}

	VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
	VirtualFree(InqSRB, 0, MEM_RELEASE);
	return TRUE;
}

BOOL StartUnit (void)
{
	void	*InqSRB;		
	DBGS("StartUnit\n\r");

	InqSRB = VirtualAlloc(NULL, ASPI_SRB_LEN, MEM_COMMIT, PAGE_READWRITE);
	if (!InqSRB)
		DBGS("StartUnit Allocation Failed ONE\n\r");
	memset(InqSRB, 0, ASPI_SRB_LEN);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Cmd		= SC_EXEC_SCSI_CMD;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Flags		= SRB_DIR_IN;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer	= NULL;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufLen		= 0;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_SenseLen	= SENSE_LEN;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_CDBLen		= 12;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [0]	= 0x1B;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [1]	= 0x01;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [4]	= 0x01;

	if (!SendDeviceCommand(InqSRB))
	{
		VirtualFree(InqSRB, 0, MEM_RELEASE);
		return FALSE;
	}
	VirtualFree(InqSRB, 0, MEM_RELEASE);
	Sleep(5000);	//???Shit how can I get rid of this and things still stable
	return TRUE;
}

BOOL Report3f (void)
{
	void	*InqSRB;		
	DBGS("Report3f\n\r");
	InqSRB = VirtualAlloc(NULL, ASPI_SRB_LEN, MEM_COMMIT, PAGE_READWRITE);
	if (!InqSRB)
		DBGS("Report3f Allocation Failed ONE\n\r");
	memset(InqSRB, 0, ASPI_SRB_LEN);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Cmd			= SC_EXEC_SCSI_CMD;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Flags			= SRB_DIR_IN;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer	= NULL;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufLen		= 0;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_SenseLen	= SENSE_LEN;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_CDBLen		= 12;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [0]	= 0xA4;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [8]	= 0xFF;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [9]	= 0xFF;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [10]	= (0x3F | gbAGID);	

	if (!SendDeviceCommand(InqSRB))
	{
		VirtualFree(InqSRB, 0, MEM_RELEASE);
		return FALSE;
	}
	VirtualFree(InqSRB, 0, MEM_RELEASE);
	return TRUE;
}

BOOL Report0 (void)
{
	void	*InqSRB;		
	BYTE	*pByte;
	DBGS("Report0\n\r");
	InqSRB = VirtualAlloc(NULL, ASPI_SRB_LEN, MEM_COMMIT, PAGE_READWRITE);
	if (!InqSRB)
		DBGS("Report0 Allocation Failed ONE\n\r");
	memset(InqSRB, 0, ASPI_SRB_LEN);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Cmd	   	= SC_EXEC_SCSI_CMD;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Flags	   	= SRB_DIR_IN | SRB_POSTING;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer	= 
			VirtualAlloc(NULL, REPORT0_BUFFER_LENGTH, MEM_COMMIT, PAGE_READWRITE);
	if (!InqSRB)
		DBGS("Report0 Allocation Failed TWO\n\r");
	memset(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, REPORT0_BUFFER_LENGTH);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufLen		= REPORT0_BUFFER_LENGTH;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_SenseLen	= SENSE_LEN;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_CDBLen		= 12;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [0]	= 0xA4;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [9]	= REPORT0_BUFFER_LENGTH;
	
	if (!SendDeviceCommand(InqSRB))
	{
		VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
		VirtualFree(InqSRB, 0, MEM_RELEASE);
		return FALSE;
	}

	//***Now get AGID back, the AGID should be in the upper 2 bit of Byte 7.
	//***Currently I don't use this AGID, could this be a problem that why
	//***it doesn't work on Toshiba and Philips Drives ???
	if (!ReadDeviceBuffer(InqSRB))
	{
		VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
		VirtualFree(InqSRB, 0, MEM_RELEASE);
		return FALSE;
	}
	pByte = (Byte *)((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer;

	gbAGID = *(pByte+7) & 0xc0;	//***Save AGID 

	VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
	VirtualFree(InqSRB, 0, MEM_RELEASE);
	return TRUE;
}

BOOL SndKey1 (Byte challenge[10])
{
	void	*InqSRB;			
	Byte	*pByte;

	DBGS("SndKey1\n\r");
	InqSRB = VirtualAlloc(NULL, ASPI_SRB_LEN, MEM_COMMIT, PAGE_READWRITE);
	if (!InqSRB)
		DBGS("SndKey1 Allocation Failed ONE\n\r");
	memset(InqSRB, 0, ASPI_SRB_LEN);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Cmd		= SC_EXEC_SCSI_CMD;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Flags		= SRB_DIR_OUT;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer	=
			VirtualAlloc(NULL, SENDKEY1_BUFFER_LENGTH, MEM_COMMIT, PAGE_READWRITE);

	if (!((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer)
		DBGS("SndKey1 Allocation Failed TWO\n\r");

	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufLen		= SENDKEY1_BUFFER_LENGTH;
	memset(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, SENDKEY1_BUFFER_LENGTH);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_SenseLen	= SENSE_LEN;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_CDBLen		= 12;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [0]	= 0xA3;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [9]	= 0x10;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [10]	= (0x01 | gbAGID);

	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer[0] = 0;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer[1] = 0x0E;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer[2] = 0;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer[3] = 0;

	pByte = (PByte)&((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer[4];
	memcpy(pByte, challenge, 10);

	if (!SendDeviceCommand(InqSRB))
	{
		VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
		VirtualFree(InqSRB, 0, MEM_RELEASE);
		return FALSE;
	}
	VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
	VirtualFree(InqSRB, 0, MEM_RELEASE);
	return TRUE;
}

BOOL Report2 (Byte response[5])
{
	void	*InqSRB;		
	Byte	*pByte;

	DBGS("Report2\n\r");
	InqSRB = VirtualAlloc(NULL, ASPI_SRB_LEN, MEM_COMMIT, PAGE_READWRITE);
	if (!InqSRB)
		DBGS("Report2 Allocation Failed ONE\n\r");
	memset(InqSRB, 0, ASPI_SRB_LEN);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Cmd			= SC_EXEC_SCSI_CMD;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Flags			= SRB_DIR_IN | SRB_POSTING;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer	= 
			VirtualAlloc(NULL, REPORT2_BUFFER_LENGTH, MEM_COMMIT, PAGE_READWRITE);

	if (!((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer)
		DBGS("Report2 Allocation Failed TWO\n\r");
	memset(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, REPORT2_BUFFER_LENGTH);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufLen		= REPORT2_BUFFER_LENGTH;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_SenseLen		= SENSE_LEN;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_CDBLen		= 12;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [0]		= 0xA4;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [9]		= 0x0C;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [10]		= (0x02 | gbAGID);
	
	if (!SendDeviceCommand(InqSRB))
	{
		VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
		VirtualFree(InqSRB, 0, MEM_RELEASE);
		return FALSE;
	}
	if (!ReadDeviceBuffer(InqSRB))
	{
		VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
		VirtualFree(InqSRB, 0, MEM_RELEASE);
		return FALSE;
	}
	pByte = (PByte)&((PSRB_ExecSCSICmd)InqSRB)->SRB_BufPointer[4];	
	memcpy(response, pByte, 5);
	VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
	VirtualFree(InqSRB, 0, MEM_RELEASE);
	return TRUE;
}

BOOL Report1 (Byte challenge[10])
{
	void	*InqSRB;		
	Byte	*pByte;

	DBGS("Report1\n\r");
	InqSRB = VirtualAlloc(NULL, ASPI_SRB_LEN, MEM_COMMIT, PAGE_READWRITE);
	if (!InqSRB)
		DBGS("Report1 Allocation Failed ONE\n\r");
	memset(InqSRB, 0, ASPI_SRB_LEN);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Cmd			= SC_EXEC_SCSI_CMD;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Flags			= SRB_DIR_IN | SRB_POSTING;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer	= 
			VirtualAlloc(NULL, REPORT1_BUFFER_LENGTH, MEM_COMMIT, PAGE_READWRITE);
	if (!((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer)
		DBGS("Report1 Allocation Failed TWO\n\r");
	memset(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, REPORT1_BUFFER_LENGTH);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufLen		= REPORT1_BUFFER_LENGTH;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_SenseLen		= SENSE_LEN;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_CDBLen		= 12;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [0]		= 0xA4;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [9]		= 0x10;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [10]		= (0x01 | gbAGID);
	
	if (!SendDeviceCommand(InqSRB))
	{
		VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
		VirtualFree(InqSRB, 0, MEM_RELEASE);
		return FALSE;
	}
	if (!ReadDeviceBuffer(InqSRB))
	{
		VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
		VirtualFree(InqSRB, 0, MEM_RELEASE);
		return FALSE;
	}
	pByte = (PByte)&((PSRB_ExecSCSICmd)InqSRB)->SRB_BufPointer[4];
	memcpy((PByte)challenge, pByte, 10);
	VirtualFree(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, MEM_RELEASE);
	VirtualFree(InqSRB, 0, MEM_RELEASE);
	return TRUE;
}

BOOL SndKey3 (Byte response[5])
{
	void	*InqSRB;		
	Byte  *pByte;

	DBGS("SndKey3\n\r");
	InqSRB = VirtualAlloc(NULL, ASPI_SRB_LEN, MEM_COMMIT, PAGE_READWRITE);
	if (!InqSRB)
		DBGS("SndKey3 Allocation Failed ONE\n\r");
	memset(InqSRB, 0, ASPI_SRB_LEN);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Cmd		= SC_EXEC_SCSI_CMD;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_Flags		= SRB_DIR_OUT;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer	= 
			VirtualAlloc(NULL, SENDKEY3_BUFFER_LENGTH, MEM_COMMIT, PAGE_READWRITE);
	if (!((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer)
		DBGS("SndKey3 Allocation Failed TWO\n\r");
	memset(((PSRB_ExecSCSICmd) InqSRB)->SRB_BufPointer, 0, SENDKEY3_BUFFER_LENGTH);
	((PSRB_ExecSCSICmd) InqSRB)->SRB_BufLen		= SENDKEY3_BUFFER_LENGTH;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_SenseLen	= SENSE_LEN;
	((PSRB_ExecSCSICmd) InqSRB)->SRB_CDBLen		= 12;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [0]	= 0xA3;
	((PSRB_ExecSCSICmd) InqSRB)->CDBByte [9]	= 0x0C;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -