📄 authhost.c
字号:
#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 + -