Форум: "Система";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];
Внизадрес LPT порта в Win2k Найти похожие ветки
← →
SergePik (2002-10-14 15:12) [0]Как получить адрес LPT порта в Win2k.
т.е. с $378 через драйвер общение есть.
Но он же не всегда $378? Тогда как узнать какой.
asm
push es
push ebx
mov ebx, 1 // 1 is PortNo
shl ebx,1
mov ax,40h // Dos segment adress
mov es,ax
mov ax,ES:[ebx+6] // get port adress in 16Bit way :(
pop ebx
pop es
end;
не проходит в строке с ":("
← →
DC-AC (2002-10-14 15:26) [1]Один метод - через реестр. Другой метод - шлёшь в базовый адрес какую-нибудь сигнатуру ($55 или $AA) и читаешь. Если сигнатура там есть - базовый адрес правильный.
← →
Serge Pik (2002-10-14 15:40) [2]через реестр - хорошая идея, но прошустрил поиском весь реестр поиском по 378 (и 888 тоже), но нужного ключа не нашел. Что касается проверки базы, то согласен. Вопрос, что делать если база - не $378? Надо драйверу дать правильную базу, а я на прямую к $408, где база LPT прописана не могу обратиться, где в регистре он прописан - не знаю, прощай мой табор пою в последний раз, ямщик не гони лошадей, и ни кто не узнает...
← →
han_malign (2002-10-14 16:19) [3]HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\Ports
- находишь где описан Lpt и лезешь скажем в HKEY_LOCAL_MACHINE\Enum\BIOS\*PNP0400\00\LogConfig - вот тебе и порт.
З.Ы. Вообще все это делается через SetupAPI и CfgMgr32, но это надо довольно много ковыряться (выяснить GUID класса портов, проенумить все порты по классу, выбрать нужный, получить Device Node, по DevNode прочитать загруженную логическую конфигурацию),
например вот так я нахожу все подключенные пленочные накопители
const guidTapeClass: TGUID="{6D807884-7D21-11CF-801C-08002BE10318}";
function EnumerateTapeDrives: DWORD;
var
hDevInfoSet : HDEVINFO;
DevInfoData : SP_DEVINFO_DATA;
_s : ShortString;
i: integer;
begin
Result:=0;
//Создание списка информации об устройствах
hDevInfoSet := SetupDiGetClassDevsA(@guidTapeClass,Nil,0,DIGCF_PRESENT);
if((hDevInfoSet=0)or(hDevInfoSet=INVALID_HANDLE_VALUE))then begin
flogln("di.log","Create DeviceInfoList failed 0x" + HexDWord(GetLastError));
exit;
end;
DevInfoData.cbSize := sizeof(DevInfoData);
while SetupDiEnumDeviceInfo(hDevInfoSet,Result,DevInfoData)do begin
inc(Result);
for i:=Low(cProps)to High(cProps)do
if(SetupDiGetDeviceRegistryPropertyA(
hDevInfoSet,
DevInfoData,
i,
nil,
_s[1],
255,
nil))
then begin
_s:=PChar(@_s[1]);
flogln("di.log",cProps[i]+": "+_s);
end
else flogln("di.log","Get Device Reg Prop failed 0x" + HexDWord(GetLastError));
end;
end;
← →
han_malign (2002-10-14 16:22) [4]заголовочники для SetupAPI,cfgmgr32 - я под дельфю перетаскивал могу намылить
← →
han_malign (2002-10-14 16:26) [5]а вот эта функция проверяет не использует ли какое нибудь устройство заданный диапазон адресов
function CheckIORange(qwBaseAddress,qwEndAddress :DWORDLONG;
var szConflictDevice : ShortString): boolean;
var
ret : CONFIGRET;
hDevInfoSet : HDEVINFO;
DevInfoData : SP_DEVINFO_DATA;
conf : LOG_CONF;
iter : DWORD;
resDes : RES_DES;
res : PIO_RESOURCE;
siz{, devStatus,devPrNo} : ULONG;
i : integer;
_s,_d : ShortString;
begin
Result:=false;szConflictDevice:="";
if(qwBaseAddress>qwEndAddress)then exit;
//Tючфрэшх ёяшёър шэЇюЁьрЎшш юс єёЄЁющёЄтрї
hDevInfoSet := SetupDiGetClassDevsA(Nil,Nil,0,DIGCF_ALLCLASSES);
if((hDevInfoSet=0)or(hDevInfoSet=INVALID_HANDLE_VALUE))then begin
flogln("di.log","Create DeviceInfoList failed 0x" + HexDWord(GetLastError));
exit;
end;
DevInfoData.cbSize := sizeof(DevInfoData);
i:=0;
while SetupDiEnumDeviceInfo(hDevInfoSet,i,DevInfoData)do begin
inc(i);
if(SetupDiGetDeviceRegistryPropertyA(
hDevInfoSet,
DevInfoData,
SPDRP_DEVICEDESC,
nil,
_s[1],
255,
nil))
then _s:=PChar(@_s[1])
else flogln("di.log","Get Device Reg Prop failed 0x" + HexDWord(GetLastError));
(*
if((ret=CM_Get_DevNode_Status(&devStatus,&devPrNo,DevInfoData.DevInst,0))!=CR_SUCCESS){
// flogln("di.log","Get DevNode Status fail(%#Lx)\n",ret);
continue;
}
// flogln("di.log","DevNode Status :%#Lx; Problem :%#Lx\n",devStatus,devPrNo);
// if(!(devStatus & DN_STARTED))continue;
*)
ret:=CM_Get_First_Log_Conf(@conf,DevInfoData.DevInst,ALLOC_LOG_CONF);
if(ret<>CR_SUCCESS)then begin
flogln("di.log","Get LogConf fail 0x"+HexDWord(ret));
continue;
end;
iter := conf;
while(CM_Get_Next_Res_Des(resDes,iter,ResType_IO,Nil,0)=CR_SUCCESS)do begin
iter := resDes;
ret:=CM_Get_Res_Des_Data_Size(siz,resDes,0);
if(ret<>CR_SUCCESS)then begin
flogln("di.log","Get ResDes Data Size fail 0x"+HexDWord(ret));
continue;
end;
GetMem(res,siz);
if(res=nil)then begin
flogln("di.log","Memory allocation Error");
exit;
end;
ret:=CM_Get_Res_Des_Data(resDes,res^,siz,0);
if(ret<>CR_SUCCESS)then begin
flogln("di.log","Get ResDes Data fail 0x"+HexDWord(ret));
continue;
end;
_d:=" Ranges (0x"+HexDword(res^.IO_Header.IOD_Alloc_Base)+
"-0x"+HexDword(res^.IO_Header.IOD_Alloc_End)+")";
flogln("di.log",_s+_d);
if(not(((qwBaseAddress > res^.IO_Header.IOD_Alloc_End) and
(qwEndAddress > res^.IO_Header.IOD_Alloc_End)) or
((qwBaseAddress < res^.IO_Header.IOD_Alloc_Base) and
(qwEndAddress < res^.IO_Header.IOD_Alloc_Base))))
then begin
szConflictDevice:=_s;
FreeMem(res);
exit;
end;
FreeMem(res);
(*
for(DWORD j = 0; j < res->IO_Header.IOD_Count; j++){
flogln("di.log"," %#Lx/%#Lx-%#Lx(%#Lx,%#Lx,%#Lx);",
res->IO_Data[j].IOR_nPorts,
_1=res->IO_Data[j].IOR_Min,
_2=res->IO_Data[j].IOR_Max,
res->IO_Data[j].IOR_Alias,
res->IO_Data[j].IOR_Align,
res->IO_Data[j].IOR_RangeFlags);
}
*)
end;
end;
Result:=true;
end;
← →
DC-AC (2002-10-15 07:36) [6]Serge Pik :
вот как выглядит эта процедура (с сигнатурой) на ассемблере, реализация на Delphi будет зависеть от того, КАК ты будешь обращаться к портам - напрямую или через драйвер.
PROC GetLPTBase
mov dx, 278h ;Определяем базовый адрес параллельного
mov al, 55h ;порта (проверяются только LPT2 и LPT3,
out dx, al ;и в случае их необнаружения, базовым
in al, dx ;адресом считается порт LPT1 - 378H).
cmp al, 55h ;Адрес порта записывается в ячейку памяти
jnz @@2 ;LPT_ADR
mov al, 0aah
out dx, al
in al, dx
cmp al, 0aah
jnz @@2
@@1: mov [LPTAdr], dx
jmp @@3
@@2: mov dx, 3bch
mov al, 55h
out dx, al
in al, dx
cmp al, 55h
jnz @@3
mov al, 0aah
out dx, al
in al, dx
cmp al, 0aah
jnz @@3
jmp @@1
@@3: ret
ENDP
← →
dm37 (2002-10-15 12:44) [7]To SergePik:
Если не сложно, то покажите код, как вы работаете с порами через драйвер под Win2000.
Интересует можно ли читать COM-порт (CTS,DSR).
Я так понимаю пример DC-AC для работы напрямую.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c