帮帮忙,把下面的程序改成C,delphi我不懂

Imlym 2001-09-28 12:06:10

//-------------------------------------------------------------
function ScsiNumber( DeviceHandle : THandle ) : String;
{$ALIGN ON}
type
TScsiPassThrough = record
Length : Word;
ScsiStatus : Byte;
PathId : Byte;
TargetId : Byte;
Lun : Byte;
CdbLength : Byte;
SenseInfoLength : Byte;
DataIn : Byte;
DataTransferLength : ULONG;
TimeOutValue : ULONG;
DataBufferOffset : DWORD;
SenseInfoOffset : ULONG;
Cdb : Array[0..15] of Byte;
end;
TScsiPassThroughWithBuffers = record
spt : TScsiPassThrough;
bSenseBuf : Array[0..31] of Byte;
bDataBuf : Array[0..191] of Byte;
end;
{ALIGN OFF}
var dwReturned : DWORD;
len : DWORD;
Buffer : Array[0..255] of Byte;
sptwb : TScsiPassThroughWithBuffers absolute Buffer;
begin
Result := '';
FillChar(Buffer,SizeOf(Buffer),#0);
with sptwb.spt do
begin
Length := SizeOf(TScsiPassThrough);
CdbLength := 6; // CDB6GENERIC_LENGTH
SenseInfoLength := 24;
DataIn := 1; // SCSI_IOCTL_DATA_IN
DataTransferLength := 192;
TimeOutValue := 2;
DataBufferOffset := PChar(@sptwb.bDataBuf)-PChar(@sptwb);
SenseInfoOffset := PChar(@sptwb.bSenseBuf)-PChar(@sptwb);
Cdb[0] := $12; // OperationCode := SCSIOP_INQUIRY;
Cdb[1] := $01; // Flags := CDB_INQUIRY_EVPD; Vital product data
Cdb[2] := $80; // PageCode Unit serial number
Cdb[4] := 192; // AllocationLength
end;
len := sptwb.spt.DataBufferOffset+sptwb.spt.DataTransferLength;
if DeviceIoControl( DeviceHandle, $0004d004, @sptwb, SizeOf(TScsiPassThrough), @sptwb, len, dwReturned, nil )
and ((PChar(@sptwb.bDataBuf)+1)^=#$80)
then SetString( Result, PChar(@sptwb.bDataBuf)+4, Ord((PChar(@sptwb.bDataBuf)+3)^) );
end;
//=============================================================
var
hDevice : THandle = 0;
sSerNum, sDeviceName : String;

begin
sDeviceName := ParamStr(1);
hDevice=CreateFile( PChar('\\.\'+sDeviceName), GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 )
sSerNum := ScsiNumber(hDevice);
end.
...全文
67 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Imlym 2001-09-28
  • 打赏
  • 举报
回复
typedef struct _ScsiPassThrough {
WORD Length;
char ScsiStatus;
char PathId;
char TargetId;
char Lun;
char CdbLength;
char SenseInfoLength;
char DataIn;
ULONG DataTransferLength;
ULONG TimeOutValue;
DWORD DataBufferOffset;
ULONG SenseInfoOffset;
unsigned char Cdb[16];
}ScsiPassThrough;

typedef struct _ScsiPassThroughWithBuffers {
ScsiPassThrough spt;
char bSenseBuf[32];
char bDataBuf[192];
}ScsiPassThroughWithBuffers;

DWORD len;
char Buffer[256];
ScsiPassThroughWithBuffers sptwb;

sptwb.spt.Length = sizeof(ScsiPassThrough);
sptwb.spt.CdbLength = 6; // CDB6GENERIC_LENGTH
sptwb.spt.SenseInfoLength = 24;
sptwb.spt.DataIn = 1; // SCSI_IOCTL_DATA_IN
sptwb.spt.DataTransferLength = 192;
sptwb.spt.TimeOutValue = 2;
sptwb.spt.DataBufferOffset = (DWORD)&(sptwb.bDataBuf) - (DWORD)&sptwb;
sptwb.spt.SenseInfoOffset = (ULONG)&(sptwb.bSenseBuf) - (ULONG)&sptwb;
sptwb.spt.Cdb[0]=0x12; // OperationCode := SCSIOP_INQUIRY;
sptwb.spt.Cdb[1]=0x01; // Flags := CDB_INQUIRY_EVPD; Vital product data
sptwb.spt.Cdb[2]=0x80; // PageCode Unit serial number
sptwb.spt.Cdb[3]=192; // AllocationLength

len = sptwb.spt.DataBufferOffset + sptwb.spt.DataTransferLength;

DeviceIoControl(LC_File_Handle,0x0004d004,&sptwb,sizeof(ScsiPassThrough),&sptwb,len,&LC_IO_Return,0);
这样改了不对。错在那里!
Nizvoo 2001-09-28
  • 打赏
  • 举报
回复
我的心好浮。
cobi 2001-09-28
  • 打赏
  • 举报
回复
gz
Imlym 2001-09-28
  • 打赏
  • 举报
回复
我太抽心大意啦,白忙了好几天!
sptwb.spt.Cdb[3]=192; 应是 sptwb.spt.Cdb[4]=192;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧