根据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;
}