Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
Цитата:
in/out под Windows делать нельзя, если ты не используеш спейиальный драйвер по типу GiveIO
Ray Adams ты же для меня сам перекомпилил GiveIO За что тебе большое спасибо, еще раз! Код рабочий поскольку и под Пасом и под асмом я получаю то, что хочу. Решил попытать Делфи(перед тем как разбираться в VC7), а он никак.
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Daemon Так и писал, что не загрузив драйвер в начале, ты никак не сможеш использовать команды in/out под Windows!
Или ты не знаеш как его грузануть? Давай дам пример.
Member
Статус: Не в сети Регистрация: 13.02.2004 Откуда: Вологда-Москва
Товарищи! у меня отстой (а может у делфи?!)
Цикл:
выводит в мемо строчку, и шесть чилел (каждая в своей строчке), выводит разные - три раза (цифры и строка меняются в зависимости от i (всё в массивах) но почему-то неработает! выводится только первый строка и щифры, а вторые две не выводятся! хотя имеют значение. во:
for i:=0 to 3 do
begin
ii:=i*8;
frmMain.memH.Lines.Add(' ');
frmMain.memH.Lines[ii]:=f[ii];
frmMain.memH.Lines.Add(' ');
frmMain.memH.Lines[ii+1]:=inttostr(g[ii,0]);
frmMain.memH.Lines.Add(' ');
frmMain.memH.Lines[ii+2]:=inttostr(g[ii,1]);
frmMain.memH.Lines.Add(' ');
frmMain.memH.Lines[ii+3]:=inttostr(g[ii,2]);
frmMain.memH.Lines.Add(' ');
frmMain.memH.Lines[ii+4]:=inttostr(g[ii,3]);
frmMain.memH.Lines.Add(' ');
frmMain.memH.Lines[ii+5]:=inttostr(g[ii,4]);
frmMain.memH.Lines.Add(' ');
frmMain.memH.Lines[ii+6]:=inttostr(g[ii,5]);
end;
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Daemon Погоди, от того что драйвер загружен это еще ничего не дает твоей программе. Ты самой программой должен подключится к драйверу! Какже по другому то?
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Daemon Вот кусок кода по загрузке драйвера , аналогичного твоему.
Код:
function TfrmAGPInfo.LoadIODriver: boolean; var s:String; hManager,hService:SC_HANDLE; b:PChar; TR:TResourceStream; tmpsdir:array[0..255] of char; begin if Win32Platform<>VER_PLATFORM_WIN32_NT then begin result:=true; exit; end; TR:=TResourceStream.Create(0,'AGPSYS',RT_RCDATA); GetTempPath(255,tmpsdir); s:=StrPas(tmpsdir); s:=s+'rvbedit.sys'; TR.SaveToFile(s); TR.Free; //s:=ExtractFilePath(ParamStr(0))+'\rvbedit.sys'; // hManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if (hManager=0) then begin ShowMessage(frmMain.GetString(3055)); result:=false; exit; end; hService := CreateService (hManager // SCManager database , 'rvbedit' // name of service , 'rvbedit' // name to display , SERVICE_ALL_ACCESS // desired access , SERVICE_KERNEL_DRIVER // service type , SERVICE_DEMAND_START // start type , SERVICE_ERROR_NORMAL // error control type , pchar(s) // service's binary , nil // no load ordering group , nil // no tag identifier , nil // no dependencies , nil // LocalSystem account , nil // no password ); if (hService=0) then begin //RaiseLastOSError; result:=false; exit;
end; if (hService<>0) then CloseServiceHandle(hService); hService := OpenService(hManager, 'rvbedit', SERVICE_ALL_ACCESS); if (hService<>0) then begin b:=nil; if StartService(hService, 0, b) then CloseServiceHandle(hService) else ;//RaiseLastOSError; end;
m_hDriver := CreateFile('\\.\rvbedit', GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (m_hDriver = INVALID_HANDLE_VALUE) then begin CloseServiceHandle(hManager); result:=FALSE; exit; end; CloseServiceHandle(hManager); result:=true; try deletefile(s); except
end;
end;
Драйвер лежит прямо в .exe иде ресурса, но если он у тебя просто в каталоге с программой, то там есть заремаренные строки
//s:=ExtractFilePath(ParamStr(0))+'\rvbedit.sys';
//
все что до них убери, да и замени везде rvbedit.sys на свой.
вот этой строкой ты подключаешся к драйверу.
m_hDriver := CreateFile('\\.\rvbedit', GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
Ray Adams огромное спасибо
Я так понял это часть исходного кода X-BIOS Editor, который я активно юзал. Ты использовал встроенные ф-ции Делфи или все-таки делал асмовские вставки?
Надо все-таки попробовать подгрузить драйвер на Делфи!
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Цитата:
Делфи или все-таки делал асмовские вставки?
Использовал ассемблер в Дельфи, так точнее будет сказано.
главное тебе не сколько даже загрузить сам драйвер, сколько подключится к нему через CreateFile
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Daemon Вот функции, которые которые выдают байт и word из адресного пространства PCI
Код:
procedure GetBusDataByte(dwBus:byte;dwDev,dwFunc:byte;dwOffset: word ; var result:byte); procedure GetBusDataWord(dwBus:byte;dwDev,dwFunc:byte;dwOffset: byte ; var result:word);
procedure TfrmAGPInfo.GetBusDataByte; var dwCmd:dword; dwCmd2:word; a:byte; r:byte; begin a:=dwDev shl 3; a:=a or dwFunc; dwCmd := ($80000000 or (dwBus and $ff) shl 16) or (a shl 8 ) or (dwOffset and $fc); asm mov dx,0cf8h mov eax,dwCmd out dx,eax end; dwCmd2:= $cfc+(dwOffset and 3); asm mov dx,dwCmd2 in al,dx mov r,al end; result:=r; end;
procedure TfrmAGPInfo.GetBusDataWord(dwBus, dwDev, dwFunc, dwOffset: byte; var result: word); var dwCmd:dword; dwCmd2:word; a,b:byte; begin a:=dwDev shl 3; a:=a or dwFunc; dwCmd := ($80000000 or (dwBus and $ff) shl 16) or (a shl 8 ) or (dwOffset and $fc); asm mov dx,0cf8h mov eax,dwCmd out dx,eax end; dwCmd2:= $cfc+(dwOffset and 3); asm mov dx,dwCmd2 in al,dx mov a,al end; dwCmd2:= $cfc+(dwOffset and 3)+1; asm mov dx,dwCmd2 in al,dx mov b,al end; result:=makeword(a,b); end;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения