Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2011, 14:47   #1
tolder
Новичок
Джуниор
 
Регистрация: 28.08.2011
Сообщений: 1
По умолчанию SCSI_WRITE10 & INVALID ADDRESS FOR WRITE

Здравствуйте. Суть - простейшая программка для записи дисков напрямую чрез ASPI.

[too]
// Настройки MODE SELECT 10
// ......
buf[8]=0x05;
buf[9]=0x32;
buf[10]=0x01;
buf[11]=0x46;
buf[12]=0x08;
// .......
Srex.CDBByte[0]=SCSI_MODE_SEL10;
Srex.CDBByte[1]=0x10;
Srex.CDBByte[7]=0x01;
Srex.CDBByte[8]=0x00;

// Функция записи

BYTE write(BYTE adap, BYTE targ, char *st){
DWORD Sendcom, size;
HANDLE hel, hev;
unsigned char buf[2048];
long lba=0; // адрес первого сектора диска
SRB_ExecSCSICmd Srex;
hel=CreateFile(st,GENERIC_READ|GENE RIC_WRITE,NULL,NULL,OPEN_EXISTING,N ULL,NULL);
if(hel==INVALID_HANDLE_VALUE){cout< <"Handle create fail!!"<<endl;}
size=GetFileSize(hel,NULL);
for(DWORD sect=0;sect<size/2048;sect++){
hev=CreateEvent(NULL,TRUE,FALSE,NUL L);
if(!hev){cout<<"Event fail!!!"<<endl;}
memset(&Srex,0,sizeof(SRB_ExecSCSIC md));
memset(&buf,0,2048);
if (!ReadFile(hel,&buf,sizeof(buf),&co unt,NULL))cout<<"Read fail!!! "<<GetLastError()<<endl;
Srex.SRB_Cmd=SC_EXEC_SCSI_CMD;
Srex.SRB_Flags=SRB_DIR_OUT|SRB_EVEN T_NOTIFY;
Srex.SRB_HaId=adap;
Srex.SRB_Target=targ;
Srex.SRB_SenseLen=SENSE_LEN;
Srex.SRB_CDBLen=10;
Srex.SRB_Lun=0;
Srex.SRB_BufPointer=buf;
Srex.SRB_BufLen=2048;
Srex.SRB_PostProc=(LPVOID)hev;
Srex.CDBByte[0]=SCSI_WRITE10;
Srex.CDBByte[1]=0x00;
Srex.CDBByte[2]=(lba>>24);
Srex.CDBByte[3]=(lba>>16);
Srex.CDBByte[4]=(lba>>8);
Srex.CDBByte[5]=lba;
Srex.CDBByte[8]=0x01;
ResetEvent(hev);
Sendcom=SendASPI32Command((LPSRB)&S rex);
if(Sendcom==SS_PENDING){
if (WAIT_TIMEOUT!=WaitForSingleObject( hev,INFINITE)){
CloseHandle(hev);break;}
}
if(Sendcom==SS_COMP){CloseHandle(he v);break;}
lba++; //записав один сектор переходим к следующему

if(Gta==SS_ERR && Srex.SRB_TargStat==STATUS_CHKCOND){
cout<<"Write sense key: "<<(DWORD*)(Srex.SenseArea[2])<<endl;
cout<<"Write ASC: "<<(DWORD*)Srex.SenseArea[12]<<endl;
cout<<"Write ASCQ: "<<(DWORD*)Srex.SenseArea[13]<<endl;
return Srex.SRB_Status;
}

}
return Srex.SRB_Status;
}
[/too]

Происходит запись одного сектора по адресу 0. При попытке записи следующего сектора вываливается ошибка:
05 21 02 - INVALID ADDRESS FOR WRITE. Почему? Помогите разобраться, пожалуйста.
tolder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Access violation at address 004733C4 in module 'loginin.exe'. Read of address 00000048' pavellyba Общие вопросы Delphi 2 18.08.2011 10:32
Access violation at address 00447E73 in modul Project.exe. Read of address 00000057. ArtGrek Общие вопросы Delphi 40 12.03.2011 22:03
Access violation at address 00478D0E in module 'Project1.exe'. Write of address 00000000 fondreykus-1 Общие вопросы Delphi 5 27.01.2010 14:25
почему может возникать ошибка access violation...: write of address при создании динамического массива sleevman Помощь студентам 16 03.11.2009 20:49
Ошибка: "Access violation at address 00454F01 in module 'Project1.exe'. Read of address 00000000. Fen1x Общие вопросы Delphi 8 13.10.2007 20:13