Привет!!! Вот сушествует куча драйверов для открытия порта lpt под винду. А какова его техническая реализация? Что и куда нужно записать, изменить, по какому адресу, чтоб порт открылся и не выкидывало исключения. Подскажите что почитать по этому делу. Спасибо.
ну блин там порты есть, выводишь в них байт и на нужных контактах появляется положительный потенциал относительно земли у лпт разъема. загугли, было прикольные статьи на эту тему
Аа.. я недочитал) Тогда давай уж разберемся -драйвер драйвером, он в ринг0 работает и там доступ ко всем портам есть. А из ринг3 обращаться к устройствам напрямую - это, мягко говоря, некорректно с точки зрения логики многозадачной ОС )
ну я имею в виду если предварительно ринг0 кодом разрешить ввод/вывод в порты в карте ввода-вывода в tss
во во. Что за ТСС ,кде это что это как расшифровывается. Понятно что добраться туды мона только через драйвер.
Я так понял, что там делается с помошью недокументированных функция ядра, а как зделать с документированными, открыть доступ к порту. Или я не прав?
1. NtSetInformationProcess(ProcessUserModeIOPL) Необходима привилегия SeTcbPrivilege, как её получить непонятно. Можно отключить проверку привилегий атомарным патчем загруженного ядра. 2. NtSystemDebugControl(SysDbgSysReadIoSpace) Плохая совместимость с версиями ОС, неизвестно будет ли это работать в Висте. 3. Модификация налету TSS первого процессора, для остальных не удастся получить физический адрес TSS, поэтому прямой I/O откроется для первого процессора.
Патчинг ядро, ммммм.......... это опасно Просто у меня 4 исходника драйверов разных, и я так и немогу понять где самая главная финька которая и открывает доступ порту а так строк 60-80 кода во всех. В 2-х есть ассемблерные вставки, какие-то манипуляции с адресами и регистрами. Так и не пойму где тот самый код или функция которая разблокирует порты. Мне нужен только lpt. При запросе google TSS - очень мало линков выдаёт. Это навкрное тоже не документировано.
Код (Text): // inpout32drv.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" #include "hwinterfacedrv.h" #include "resource.h" #include "conio.h" #include "stdlib.h" void _stdcall Out32(short PortAddress, short data); short _stdcall Inp32(short PortAddress); int inst(); int start(); char str[10]; int vv; HANDLE hdriver; char path[MAX_PATH]; HINSTANCE hmodule; SECURITY_ATTRIBUTES sa; int sysver; int Opendriver(void); void Closedriver(void); BOOL APIENTRY DllMain( HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { hmodule = hModule; switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: sysver = SystemVersion(); if(sysver==2) { Opendriver(); } break; case DLL_PROCESS_DETACH: if(sysver==2) { CloseHandle(hdriver); } break; } return TRUE; } /***********************************************************************/ void Closedriver(void) { CloseHandle(hdriver); } void _stdcall Out32(short PortAddress, short data) { switch(sysver) { case 1: _outp( PortAddress,data); break; case 2: unsigned int error; DWORD BytesReturned; BYTE Buffer[3]; unsigned short * pBuffer; pBuffer = (unsigned short *)&Buffer[0]; *pBuffer = LOWORD(PortAddress); Buffer[2] = LOBYTE(data); error = DeviceIoControl(hdriver, IOCTL_WRITE_PORT_UCHAR, &Buffer, 3, NULL, 0, &BytesReturned, NULL); break; } } /*********************************************************************/ short _stdcall Inp32(short PortAddress) { BYTE retval; switch(sysver) { case 1: retval = _inp(PortAddress); return retval; break; case 2: unsigned int error; DWORD BytesReturned; unsigned char Buffer[3]; unsigned short * pBuffer; pBuffer = (unsigned short *)&Buffer; *pBuffer = LOWORD(PortAddress); Buffer[2] = 0; error = DeviceIoControl(hdriver, IOCTL_READ_PORT_UCHAR, &Buffer, 2, &Buffer, 1, &BytesReturned, NULL); return((int)Buffer[0]); break; } return 0; } /*********************************************************************/ int Opendriver(void) { hdriver = CreateFile("\\\\.\\hwinterface", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(hdriver == INVALID_HANDLE_VALUE) { if(start()) { inst(); start(); hdriver = CreateFile("\\\\.\\hwinterface", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); } return 1; } return 0; } /***********************************************************************/ int inst() { SC_HANDLE Mgr; SC_HANDLE Ser; GetSystemDirectory(path , sizeof(path)); HRSRC hResource = FindResource(hmodule, MAKEINTRESOURCE(IDR_BIN1), "bin"); if(hResource) { HGLOBAL binGlob = LoadResource(hmodule, hResource); if(binGlob) { void *binData = LockResource(binGlob); if(binData) { HANDLE file; strcat(path,"\\Drivers\\hwinterface.sys"); file = CreateFile(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); if(file) { DWORD size, written; size = SizeofResource(hmodule, hResource); WriteFile(file, binData, size, &written, NULL); CloseHandle(file); } } } } Mgr = OpenSCManager (NULL, NULL,SC_MANAGER_ALL_ACCESS); if (Mgr == NULL) { //No permission to create service if (GetLastError() == ERROR_ACCESS_DENIED) { return 5; // error access denied } } else { Ser = CreateService (Mgr, "hwinterface", "hwinterface", SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_SYSTEM_START, SERVICE_ERROR_NORMAL, "System32\\Drivers\\hwinterface.sys", NULL, NULL, NULL, NULL, NULL ); } CloseServiceHandle(Ser); CloseServiceHandle(Mgr); return 0; } /**************************************************************************/ int start(void) { SC_HANDLE Mgr; SC_HANDLE Ser; Mgr = OpenSCManager (NULL, NULL,SC_MANAGER_ALL_ACCESS); if (Mgr == NULL) { //No permission to create service if (GetLastError() == ERROR_ACCESS_DENIED) { Mgr = OpenSCManager (NULL, NULL,GENERIC_READ); Ser = OpenService(Mgr,"hwinterface",GENERIC_EXECUTE); if (Ser) { // we have permission to start the service if(!StartService(Ser,0,NULL)) { CloseServiceHandle (Ser); return 4; // we could open the service but unable to start } } } } else {// Successfuly opened Service Manager with full access Ser = OpenService(Mgr,"hwinterface",GENERIC_EXECUTE); if (Ser) { if(!StartService(Ser,0,NULL)) { CloseServiceHandle (Ser); return 3; // opened the Service handle with full access permission, but unable to start } else { CloseServiceHandle (Ser); return 0; } } } return 1; }