Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.16;
Скачать: CL | DM;

Вниз

адрес 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
6-51880
kostik78ua
2002-10-18 10:38
2002.12.16
TNMMsg+TNMMsgServ


1-51823
delfin82
2002-12-05 14:08
2002.12.16
Фора в Delphi


1-51795
Sego
2002-12-05 09:24
2002.12.16
Отображение без gride


4-52016
lesa
2002-11-04 12:36
2002.12.16
Запуск сеанса DOS в окне программы (Напр.формы Delphi)?


14-51966
Sticky
2002-11-26 21:21
2002.12.16
Как сделать архиватор?