안녕하세요.
정종구 라고 합니다.
UBackupPro6.5 버전에서 문제가 생기는데.
홈페이지 지원에 메일로 문의해도 답장이 안오네요.. ㅠ.ㅠ
(트라이얼은 그럴수 있다, 다음버전에서 해결되었다. 등등.. ??이상한
소리를 하는데 웹에 올려진 테스트 프로그램도 마찬가지 에러를
보인다는거 자체가 이상..)
문제는 SCSI어뎁터가 디폴트로 지정이 되어야만 에러가 안나는데요..
우선 SCSI에 Default 어뎁터라는 개념부터 좀 이상하구요.
모두 에러가 나는건 아니구요 원도우 설치후 4.57버전으로
사용하면 처음에는 구동하다가 쓰다보면 생기기도 합니다.
스카시 장비를 어떻게 쓰는지 자세히 몰라서..
이렇게 도움을 요청 드립니다. ㅠ.ㅠ
환경 :
ASPI 4.60, 4.57버전
HP Tape 드라이브.
Windows 2000
uBackPro 6.5를 좀 수정했으나 데이터 헤더 관련부분임..
상황설명 : 다른 원도우 관련 프로그램에서는 Tape관련 에러가 없음.
아래 코드에서 에러가 남.
DetectDevice하면 스카시 장비 ID가 걸려야 하는데
찾지 못하네요.
아래 스카시 코멘드를 날리는 함수이구요.
-- 유닛은 WNASPI32.DLL 이용함니다. --
-- 그중 에러나는 포인트만 올리구요 유닛은 첨부파일로 올립니다. --
// 아마도. 아래 함수는 SCSI테입을 찾는 함수입니다
Function TASPI32.FindTape : Integer;
var i : Integer;
begin
Result := -1;
for i:=0 to 7 do
begin
if DetectDevice(i)=DTYPE_SEQD then
begin
Result := i;
break;
end;
end;
end;
// 여기서 Tape관련 ID가 올라오지 않습니다.
// 3인가 2번이 리턴되어야 테입이라는 뜻인데.. 찾지를 못하네요..ㅠ.ㅠ
Function TASPI32.DetectDevice(SCSI_ID : Integer) : Integer;
var
CDB : TCDB6;
InBuffer : Array[0..96] of Byte;
begin
Fillchar(CDB,sizeof(CDB),0);
CDB.opcode := $12; // SCSI_INQUIRY
CDB.Params[2] := 32;
Result := ASPI_Exec(SCSI_id, @InBuffer,32, ASPI_RW_NODATA, CDB, 6);
if Result<>0 then Result := -1
else
begin
Result := InBuffer[0] and $1F;
end;
end;
//
Function TASPI32.ASPI_Exec(ASPI_ID : Integer;
Buffer : Pointer;
Buflen : Integer;
Command : Integer;
var CDB; CDBLen : Integer) : Integer;
var E_SRB : TSRB_ExecCmd;
tmpResult : Integer;
begin
FillChar(E_SRB,sizeof(E_SRB),0);
with e_SRB do
begin
SRB_Cmd := SC_EXEC_SCSI_CMD;
SRB_HaID := fActiveAdapter;
if Command=ASPI_RW_WRITE then
SRB_Flags := SRB_DIR_OUT
else
SRB_Flags := SRB_DIR_IN;
SRB_Target := ASPI_ID;
SRB_Lun := 0; // LUNs not yet supported
SRB_Buflen := BufLen;
SRB_SenseLen := SENSE_LEN;
SRB_BufPointer := Buffer;
SRB_CDBLen := CDBLen;
Move(CDB,SRB_CDBByte,CDBLen);
end;
tmpResult := SendASPI32Command(E_SRB);
asm
pop eax
end;
//
// Wait while command is pending ...
//
while (tmpResult = $00) do
begin
tmpResult := E_SRB.SRB_Status;
Sleep(10); // High CPU Run By JongKu
Application.ProcessMessages;
end;
case tmpResult of
// SS_COMP
$01 : begin
// Completed without error !
Result := 0;
end;
// SS_ABORTED
$02 : Result := 8;
// SS_ABORTION failed
$03 : Result := 9;
$04 : begin
Result := E_SRB.SRB_SenseArea[2];
end;
else Result := 9; // other error
end;
end;