Q&A

  • 컴포넌트 문제인데요... 도와주세요. ㅠ.ㅠ.
안녕하세요.

정종구 라고 합니다.

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;



0  COMMENTS