001
17.08.2002, 11:46 Uhr
Uwe
C/C++ Master (Administrator)
|
Hallo Tommix, hat etwas länger gedauert, aber kannst Du evtl. noch nutzen. Hatte nämlich ein Verständnisproblem auf den win9x Rechnern. So: Bei NT kannst Du aus der Registry lesen, bei Win9x Rechnern geht das nicht, da nur der Verweis auf die/den Treiber existent ist.
C++: |
// lpt.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung. //
#include "stdafx.h" #include "lpt.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
///////////////////////////////////////////////////////////////////////////// // Das einzige Anwendungsobjekt
CWinApp theApp;
using namespace std; typedef BOOL (CALLBACK * PROCTYPE_Toolhelp32ReadProcessMemory)( DWORD, LPCVOID, LPVOID, DWORD ,LPDWORD); #define WINDOWS_NT (!(GetVersion() & 0x80000000))
int GetPCKey(char *kKey) /*ParallelControllerKey*/ { HKEY hKey; char myData[255]; LONG res; DWORD mySize; FILETIME ftLWT;
if (NULL==kKey) return(-1);
*kKey=0;
char myKey[255]; sprintf(myKey,"HARDWARE\\DESCRIPTION\\System");
res = RegOpenKeyEx(HKEY_LOCAL_MACHINE,myKey, 0, KEY_READ, &hKey);
if (res!=ERROR_SUCCESS) return(-1);
DWORD dwIndex1; char myKey1[255]; for (dwIndex1=0;dwIndex1<=10;dwIndex1++){ mySize=sizeof(myData); res = RegEnumKeyEx(hKey,dwIndex1,myData,&mySize,NULL,NULL,NULL,&ftLWT); if (res==ERROR_SUCCESS){ strcpy(myKey1,myKey); strcat(myKey1,"\\"); strcat(myKey1,myData); HKEY hKey1; res = RegOpenKeyEx(HKEY_LOCAL_MACHINE,myKey1, 0, KEY_READ,&hKey1); if (res!=ERROR_SUCCESS) return(-1); DWORD dwIndex2; char myKey2[255]; for (dwIndex2=0;dwIndex2<=10;dwIndex2++){ mySize=sizeof(myData); res = RegEnumKeyEx(hKey1,dwIndex2,myData,&mySize,NULL,NULL,NULL,&ftLWT); if (res==ERROR_SUCCESS){ strcpy(myKey2,myKey1); strcat(myKey2,"\\"); strcat(myKey2,myData); HKEY hKey2; res = RegOpenKeyEx(HKEY_LOCAL_MACHINE,myKey2, 0, KEY_READ, &hKey2); if (res!=ERROR_SUCCESS) return(-1); DWORD dwIndex3; for (dwIndex3=0;dwIndex3<=10;dwIndex3++){ mySize=sizeof(myData); res = RegEnumKeyEx(hKey2,dwIndex3,myData,&mySize,NULL,NULL,NULL,&ftLWT); if (res==ERROR_SUCCESS){ if (0==strcmp(myData,"ParallelController") ){ strcpy(kKey,myKey2); strcat(kKey,"\\"); strcat(kKey,myData); return(0); } } } } } } } return(-1); }
int GetLptPortInRegistry(int myPort) /*NT und Folgende */ { HKEY phkResult; char myKey[255]; char myData[255]; LONG res; DWORD mySize; DWORD myType; res=GetPCKey(myKey); if (res < 0) return(-1); sprintf(myData,"%s\\%d",myKey,myPort-1); res = RegOpenKeyEx(HKEY_LOCAL_MACHINE,myData, 0, KEY_READ, &phkResult); if (res != ERROR_SUCCESS) return(-1); mySize=sizeof(myData); myType=REG_BINARY; res=RegQueryValueEx(phkResult,"Configuration Data",NULL,&myType,(unsigned char *)myData, &mySize); if (res != ERROR_SUCCESS) return(-1); return(myData[0x14] | myData[0x15]<<8 ); }
int GetLptPortInMemory(int myPort) /* Win9x und ME */ { HINSTANCE hDLL=NULL; // Handle zur DLL PROCTYPE_Toolhelp32ReadProcessMemory myProcPointer=NULL; hDLL = LoadLibrary("kernel32"); if (hDLL==NULL) return(-1); myProcPointer=(PROCTYPE_Toolhelp32ReadProcessMemory)GetProcAddress(hDLL,"Toolhelp32ReadProcessMemory"); if (myProcPointer==NULL){ FreeLibrary(hDLL); return -1; } int portAddresses[]={0,0,0,0,0}; BOOL rtn=0; DWORD cbLen=0; rtn = myProcPointer(0,(LPCVOID *) 0x408,portAddresses,8,NULL); FreeLibrary(hDLL);if (rtn==0) return(-1); if (portAddresses[myPort-1]<=0) return(-1); if (portAddresses[myPort-1]>=0x1000) return(-1); return(portAddresses[myPort-1]); }
int GetAddressLptPort(int myPort) { if(myPort<1) return(-1); if(myPort>3) return(-1); if (WINDOWS_NT) return(GetLptPortInRegistry(myPort)); return(GetLptPortInMemory(myPort)); }
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0;
// MFC initialisieren, Ausgabe und Fehlermeldung bei Fehlern if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // ZU ERLEDIGEN: Fehlercode gemäß Ihren Anforderungen ändern cerr << _T("Fatal Error: MFC initialization failed") << endl; nRetCode = 1; } else { printf("0x%02X",GetAddressLptPort(1)); //1-3 }
return nRetCode; }
|
Auf einem Win95 konnte ich nicht testen sollte aber auch funktionieren. -- "Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."
Bis dann... Uwe |