0
点赞
收藏
分享

微信扫一扫

inpoutx64.dll 或WinIOx64.dll 相关函数原型C代码实现


根据inpoutx64.dll和WinIOx64.dll,导出函数原型,使用C代码调用其中的函数;分享给需要的人;

自己在国内的网站也没有找到几个像样的代码;

那就自己整理一个吧;

运行截图:

inpoutx64.dll 或WinIOx64.dll 相关函数原型C代码实现_导出函数

 C语言源码:

#include <windows.h>
#include <stdio.h>

#define DEBUG 1

//original function
typedef void  (__stdcall* ProcOut32)(short PortAddress , short data);
typedef short (__stdcall* ProcInp32)(short PortAddress);
typedef BOOL  (__stdcall* ProcIsInpOutDriverOpen)(void);
typedef BOOL  (__stdcall* ProcIsXP64Bit)(void);

typedef unsigned char (__stdcall* ProcDlPortReadPortUchar)(unsigned short port);
typedef         void  (__stdcall* ProcDlPortWritePortUchar)(unsigned short port, unsigned char value);

typedef unsigned short (__stdcall* ProcDlPortReadPortUshort)(unsigned short port);
typedef           void (__stdcall* ProcDlPortWritePortUshort)(unsigned short port, unsigned short value);

typedef unsigned long  (__stdcall* ProcDlPortReadPortUlong)(unsigned long port);
typedef           void (__stdcall* ProcDlPortWritePortUlong)(unsigned long port, unsigned long value);

typedef PBYTE (__stdcall* ProcMapPhysToLin)(PBYTE pbPhysAddr, DWORD dwPhysSize, HANDLE* pPhysicalMemoryHandle);
typedef BOOL  (__stdcall* ProcUnmapPhysicalMemory)(HANDLE PhysicalMemoryHandle, PBYTE pbLinAddr);
typedef BOOL  (__stdcall* ProcGetPhysLong)(PBYTE pbPhysAddr, PDWORD pdwPhysVal);
typedef BOOL  (__stdcall* ProcSetPhysLong)(PBYTE pbPhysAddr, DWORD dwPhysVal);

//global function pointers
ProcOut32 Out32;
ProcInp32 Inp32;
ProcIsInpOutDriverOpen IsInpOutDriverOpen;
ProcIsXP64Bit IsXP64Bit;

ProcDlPortReadPortUchar DlPortReadPortUchar;
ProcDlPortWritePortUchar DlPortWritePortUchar;

ProcDlPortReadPortUshort DlPortReadPortUshort;
ProcDlPortWritePortUshort DlPortWritePortUshort;

ProcDlPortReadPortUlong DlPortReadPortUlong;
ProcDlPortWritePortUlong DlPortWritePortUlong;

ProcMapPhysToLin MapPhysToLin;
ProcUnmapPhysicalMemory UnmapPhysicalMemory;
ProcGetPhysLong GetPhysLong;
ProcSetPhysLong SetPhysLong;

HMODULE hModule = NULL;

/*
* Load inpoutx64.dll 
*/

BOOL LoadInpoutDll(void)
{
    hModule = LoadLibraryA("inpoutx64.dll");    //load 64 bit DLL, if compiled with 32 bit, it will return NULL;
    if (hModule == NULL) {
        fprintf(stderr, "[E]: load inpoutx64.dll failed. Is the file missing?\n");
        return 1;
    }

    Out32 = (ProcOut32)GetProcAddress(hModule, "Out32");
    Inp32 = (ProcInp32)GetProcAddress(hModule, "Inp32");
    IsInpOutDriverOpen = (ProcIsInpOutDriverOpen)GetProcAddress(hModule, "IsInpOutDriverOpen");
    IsXP64Bit = (ProcIsXP64Bit)GetProcAddress(hModule, "IsXP64Bit");
    DlPortReadPortUchar = (ProcDlPortReadPortUchar)GetProcAddress(hModule, "DlPortReadPortUchar");
    DlPortWritePortUchar = (ProcDlPortWritePortUchar)GetProcAddress(hModule, "DlPortWritePortUchar");
    DlPortReadPortUshort = (ProcDlPortReadPortUshort)GetProcAddress(hModule, "DlPortReadPortUshort");
    DlPortWritePortUshort = (ProcDlPortWritePortUshort)GetProcAddress(hModule, "DlPortWritePortUshort");
    DlPortReadPortUlong = (ProcDlPortReadPortUlong)GetProcAddress(hModule, "DlPortReadPortUlong");
    DlPortWritePortUlong = (ProcDlPortWritePortUlong)GetProcAddress(hModule, "DlPortWritePortUlong");
    MapPhysToLin = (ProcMapPhysToLin)GetProcAddress(hModule, "MapPhysToLin");
    UnmapPhysicalMemory = (ProcUnmapPhysicalMemory)GetProcAddress(hModule, "UnmapPhysicalMemory");
    GetPhysLong = (ProcGetPhysLong)GetProcAddress(hModule, "GetPhysLong");
    SetPhysLong = (ProcSetPhysLong)GetProcAddress(hModule, "SetPhysLong");

    if (Out32 == NULL ||
        Inp32 == NULL ||
        IsInpOutDriverOpen == NULL ||
        IsXP64Bit == NULL ||
        DlPortReadPortUchar == NULL ||
        DlPortWritePortUchar == NULL ||
        DlPortReadPortUshort == NULL ||
        DlPortWritePortUshort == NULL ||
        DlPortReadPortUlong == NULL ||
        DlPortWritePortUlong == NULL ||
        MapPhysToLin == NULL ||
        UnmapPhysicalMemory == NULL ||
        GetPhysLong == NULL ||
        SetPhysLong == NULL) {
        fprintf(stderr, "[E]: Some functions load failed.\n");
        return 1;
    }
}

/*
* Unload inpoutx64.dll 
*/
void UnLoadInpoutDll(void)
{
    FreeLibrary(hModule);
}

int main(int argc, char* argv[])
{
    LoadInpoutDll();

#if DEBUG == 1
    printf("Tody debug -> IsInpOutDriverOpen Function pointer: %x\n", IsInpOutDriverOpen);
#endif

    if (IsInpOutDriverOpen() == FALSE)
    {
        fprintf(stderr, "[E]: IsInpOutDriverOpen() failed.\n");
        exit(1);
    }

    //Example of Out32 and Inp32
    Out32(0x70, 0xf1);  // like EFI IoWrite8() function
    Out32(0x71, 0x02);

    printf("value write to IO port is %d\n", Inp32(0x71));

    UnLoadInpoutDll();

    return 0;
}

举报

相关推荐

0 条评论