⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 baznalptadresa.cpp

📁 pc paralel port programming
💻 CPP
字号:
// BaznaLPTAdresa.cpp: implementation of the CBaznaLPTAdresa class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "BaznaLPTAdresa.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CBaznaLPTAdresa::CBaznaLPTAdresa()
{

}

CBaznaLPTAdresa::~CBaznaLPTAdresa()
{

}

int CBaznaLPTAdresa::GetAddressLptPort(int myPort)
{
    int address = -1;

    if (myPort>=1 && myPort<=3) {
        if (IsWindowsNT()) {
            address = GetAddressLptPortInTheRegistry(myPort);
        }
        else {
            address = GetAddressLptPortInTheMemory(myPort);
        }
    }

    return address;
}

bool CBaznaLPTAdresa::IsWindowsNT( void )
{
    return !(GetVersion() & 0x80000000);
}

int CBaznaLPTAdresa::GetAddressLptPortInTheRegistry(int myPort)
{
    HKEY phkResult;
    char myKey[255];
    char myData[255];
    LONG res;
    DWORD mySize;
    DWORD myType;

    res = GetParallelControllerKey(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,					// handle to key to query
        "Configuration Data",		// address of name of value to query
        NULL,						// reserved
        &myType,					// address of buffer for value type
        (unsigned char *)myData,	// address of data buffer
        &mySize						// address of data buffer size
    );
    if (res != ERROR_SUCCESS)
    return(-1);

    //printf("config data port %d 0x14 = 0x%02X 0x15 = 0x%02X\n",myPort,myData[0x14],myData[0x15]);
    return(myData[0x14] | myData[0x15]<<8 );
}

int CBaznaLPTAdresa::GetAddressLptPortInTheMemory(int myPort)
{
    HINSTANCE hDLL=NULL; // Handle to DLL
    PROCTYPE_Toolhelp32ReadProcessMemory myProcPointer=NULL;

    hDLL = LoadLibrary("kernel32");
    if (hDLL==NULL)
    return(-1);

    myProcPointer=(PROCTYPE_Toolhelp32ReadProcessMemory)GetProcAddress(hDLL,"Toolhelp32ReadProcessMemory");
    if (myProcPointer==NULL) //handle the error
    { 
        FreeLibrary(hDLL); 
        return -1;
    }

    int portAddresses[]={0,0,0,0,0};
    BOOL rtn=0;
    DWORD cbLen=0;
    //rtn = Toolhelp32ReadProcessMemory 
    rtn = myProcPointer
        (
        0,
        (LPCVOID *) 0x408,
        portAddresses,
        8,
        NULL
        );

    FreeLibrary(hDLL); 

    if (rtn==0)
    return(-1);

    // Ovo sam ja dodao ( da bi radilo na Windows 98 )
    int portAddr;
    if      ( myPort == 1 ) {
        portAddr = portAddresses[0] & 0x0000FFFF;
    }
    else if ( myPort == 2 ) {
        portAddr = portAddresses[0] & 0xFFFF0000;
        portAddr >>= 16;
    }
    else if ( myPort == 3 ) { 
        portAddr = portAddresses[1] & 0x0000FFFF;
    }
    else {
        portAddr = -1;
    }

    if (portAddr<=0)
    return(-1);

    if (portAddr>=0x1000)
    return(-1);

    return portAddr;
/*
    if (portAddresses[myPort-1]<=0)
    return(-1);

    if (portAddresses[myPort-1]>=0x1000)
    return(-1);

    return(portAddresses[myPort-1]);
*/
}

int CBaznaLPTAdresa::GetParallelControllerKey(char *parKey)
{
    HKEY hKey;
    char myData[255];
    LONG res;
    DWORD mySize;
    FILETIME ftLastWriteTime;

    if (NULL == parKey)
    return(-1);

    *parKey=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, &ftLastWriteTime);

    	if (res==ERROR_SUCCESS) // ERROR_SUCCESS 1
    	{
    		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, &ftLastWriteTime);

    			if (res==ERROR_SUCCESS) // ERROR_SUCCESS 2
    			{
    				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,&ftLastWriteTime);
    					
    					if (res==ERROR_SUCCESS) // ERROR_SUCCESS 3
    					{
    						if (0==strcmp(myData,"ParallelController") )
    						{
    							strcpy(parKey,myKey2);
    							strcat(parKey,"\\");
    							strcat(parKey,myData);
    							return(0);
    						}
    					} // ERROR_SUCCESS 3
    				
    				} // for (dwIndex3
    			
    			} // // ERROR_SUCCESS 2
    		
    		} // for (dwIndex2
    		
    	} // ERROR_SUCCESS 1
    	
    } // for (dwIndex1

    return(-1);
} //GetParallelControllerKey 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -