Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.007 c
1-51797
memphis555
2002-12-03 00:41
2002.12.16
Эмуляция


3-51564
remim
2002-11-27 00:14
2002.12.16
ADO


3-51623
Bocman
2002-11-28 01:05
2002.12.16
Не работает ADOStoredProc


1-51828
MaXie
2002-12-05 14:49
2002.12.16
Последняя дата месяца?


3-51651
cypher
2002-11-27 00:17
2002.12.16
BDE-ODBC





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский