📄 mbaspi.pas
字号:
AB_Reserved: LongInt;
end;
type
TDiscInformation = record
DataLen: Word;
DiscStatus: Byte;
FirstTrack: Byte;
Sessions: Byte;
FirstTrackOfLastSession: Byte;
LastTrackOfLastSession: Byte;
InformationValidity: Byte;
DiscType: Byte;
Resvd: array [0..2] of Byte;
DiscIdentification: array [0..3] of Byte;
Resvd2: array [12..50] of Byte;
end;
type
TTrackInformationBlock = packed record
DataLength: Word;
TrackNumber,
SessionNumber,
Reserved1,
TrackMode,
DataMode,
Reserved2: Byte;
TrackStartAddress,
NextWritableAddress,
FreeBlocks,
FixedPacketSize,
TrackSize,
LastRecordedAddress: LongWord;
TrackNumber2,
SessionNumber2,
Res3, Res4, Res5, Res6, Res7, Res8: Byte;
end;
type
TTOCPMATIP0100 = packed record
DataLength: Word;
FirstSession, LastSession: Byte;
Field0: Byte;
Field1: Byte;
Field2: Byte;
Reserved: Byte;
StMin: Byte;
StSec: Byte;
StFrame: Byte;
Reseved2: Byte;
EdMin: Byte;
EdSec: Byte;
EdFrame: Byte;
Others: array[0..10] of byte;
end;
TModePage05 = packed record
PageCode,
PageLen: byte;
WriteType : Byte;
TrackMode : Byte;
DBType : Byte;
LinkSize: Byte;
Res6: Byte;
Host_App_Code: Byte;
SessionFormat: Byte;
Res9: Byte;
PacketSize: LongWord;
PauseLen: Word;
MediaCatNumber: array[1..16] of char;
ISRC: array[1..14] of char;
sub_header: array[1..4] of char;
vendor_uniq: array[1..4] of char;
end;
TTEST = packed record
Res1: Byte;
Res2: Byte;
Speed: WORD;
end;
TModePage2A = packed record // CD Capabilities
PageCode: Byte; //0
PageLen: Byte; //1
DiscReadCaps: Byte; //2
DiscWriteCaps: Byte; //3
AudioPlay: Byte; //4
CDDASupported: Byte; //5
Lock: Byte; //6
SepChanVol: Byte; //7
MaxReadSpeed: Word; //8-9
NumVolLevels: Word; //10-11
BufferSize:Word; //12-13
CurReadSpeed: Word; //14-15
Reserved16: Byte; //16
BCKF: Byte; //17
MaxWriteSpeed: Word; //18-19
CurWriteSpeed: Word; //20-21
CMRS: WORD; //22-23
RES24: BYTE; RES25: BYTE; RES26: BYTE; //24-26
RCS: BYTE; //27
CWSS: WORD; //28-29
WW: Word; //30-31
WriteSpeeds:array [0..120] of Ttest;
end;
TInquiryData = packed record
PeripheralData: Byte;
RMB: Byte;
Version: Byte;
Byte3: Byte;
AdditionalLen: Byte;
Byte5: Byte;
Byte6: Byte;
Byte7: Byte;
VendorID: array[8..15] of char;
ProductID: array[16..31] of char;
ProductRev: array[32..35] of char;
VendorSpecific: array[36..55] of char;
Byte56: Byte;
Reseverd: Byte;
v1, v2, v3, v4: Word;
OtherVData: array [0..62] of byte;
DeviceType: ShortInt; //PeripheralData
Qulifier: Byte;
end;
type
TTOCData0000 = packed record
DataLength : Word;
FirstTrackNumber: Byte;
LastTrackNumber: Byte;
Res1, Res2: Byte;
TrackNumber: Byte;
Res3: Byte;
TrackStartAddress: Cardinal;
OtherData: array[0..101] of byte;
end;
TTOCData0001 = packed record
DataLength : Word;
FirstTrackNumber: Byte;
LastTrackNumber: Byte;
end;
PSCSI_ADDRESS = ^SCSI_ADDRESS;
SCSI_ADDRESS = packed record
Length: Cardinal;
PortNumber,
PathId,
TargetId,
Lun: Byte;
end;
type
TDisc = record
Capacity: Integer;
DiscStatus,
LastSession
: Byte;
BackgroundFormat: Byte;
Eraseable: Boolean;
end;
var
ASPILayerName: String;
TryInternalASPIFirst: Boolean;
SendASPI32Command: function(LPSRB: Pointer):DWORD; cdecl;
GetASPI32SupportInfo: function: DWORD; cdecl;
ASPIDLLLoaded: Boolean = False;
function _InitializeASPI(InternalFirst: Boolean; AspiPath: String): Boolean;
function _ReInitializeASPI: Boolean;
function _DeInitializeASPI: Boolean;
implementation
var
ASPIDLLHandle: DWORD = 0;
{******************************************************************************}
{ _InitializeASPI }
{******************************************************************************}
function _InitializeASPI(InternalFirst: Boolean; AspiPath: String): Boolean;
var
ErrorMode: DWORD;
begin
ErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
if InternalFirst and (SPTIInit <> 0) then
begin
@GetASPI32SupportInfo := @__GetASPI32SupportInfo;
@SendASPI32Command := @__SendASPI32Command;
ASPIDLLLoaded := True;
ASPILayerName := 'BMASPI32';
end;
if not ASPIDLLLoaded then
begin
ASPIDLLHandle := 0;
try
if (AspiPath <> '')
then ASPIDLLHandle := LoadLibrary(pchar(AspiPath));
if (ASPIDLLHandle = 0)
then ASPIDLLHandle := LoadLibrary('.\WNASPI32.DLL');
if ASPIDLLHandle = 0 then
ASPIDLLHandle := LoadLibrary('WNASPI32.DLL');
except
ASPIDLLHandle := 0;
end;
if ASPIDLLHandle > 31 then
begin
ASPILayerName := 'WNASPI32.DLL';
ASPIDLLLoaded := True;
@GetASPI32SupportInfo := GetProcAddress(ASPIDLLHandle,'GetASPI32SupportInfo');
@SendASPI32Command := GetProcAddress(ASPIDLLHandle,'SendASPI32Command');
Assert(@GetASPI32SupportInfo <> nil);
Assert(@SendASPI32Command <> nil);
end
else
begin
(*
ASPIDLLHandle := LoadLibrary('ASAPI.DLL');
if ASPIDLLHandle > 31 then
begin
ASPILayerName := 'ASAPI.DLL';
ASPIDLLLoaded := True;
@GetASPI32SupportInfo := GetProcAddress(ASPIDLLHandle,'GetASAPI32SupportInfo');
Assert(@GetASPI32SupportInfo <> nil);
@SendASPI32Command := GetProcAddress(ASPIDLLHandle,'SendASAPI32Command');
Assert(@SendASPI32Command <> nil);
end; *)
end;
if (not ASPIDLLLoaded) and (SPTIInit <> 0) then
begin
@GetASPI32SupportInfo := @__GetASPI32SupportInfo;
@SendASPI32Command := @__SendASPI32Command;
ASPIDLLLoaded := True;
ASPILayerName := 'BMASPI32';
end;
end;
if ASPIDLLLoaded then
GetASPI32SupportInfo;
result := ASPIDLLLoaded;
TryInternalASPIFirst := InternalFirst;
SetErrorMode(ErrorMode);
end;
function _ReInitializeASPI: Boolean;
begin
if ASPILayerName = 'BMASPI32' then
begin
ASPIDLLLoaded := False;
SPTIDeInit;
end
else
begin
_DeInitializeASPI;
end;
_InitializeASPI(TryInternalASPIFirst, '');
result := True;
end;
function _DeInitializeASPI: Boolean;
begin
result := true;
if ASPIDLLLoaded and (ASPIDLLHandle <> 0) then
begin
ASPIDLLLoaded := False;
Result := FreeLibrary(ASPIDLLHandle);
ASPIDLLHandle := 0;
end;
end;
initialization
ASPIDLLLoaded := False;
finalization
if ASPIDLLLoaded and (ASPIDLLHandle <> 0) then
FreeLibrary(ASPIDLLHandle);
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -