agree with Richuen22(石志康), under Windows NT/2000, user mode applications are not allowed to access I/O ports directly, but take a look at WinIo (a kernel-mode device driver)http://www.internals.com" WinIo - This library allows direct I/O port and physical memory access under Windows 9x/NT/2000 and XP. Version 2.0 provides faster I/O port access, better memory mapping support and can be used from non-administrative accounts under Windows NT/2000 and XP. "
给你个Example(注意你当前的操作员的权限是不是超级管理员 DWORD dwPortVal; DWORD dwMemVal; bool bResult; HANDLE hPhysicalMemory; PBYTE pbLinAddr; // Call InitializeWinIo to initialize the WinIo library. bResult = InitializeWinIo(); //初始化winio 不忘了 if (bResult) { // Under Windows NT/2000/XP, after calling InitializeWinIo, // you can call _inp/_outp instead of using GetPortVal/SetPortVal GetPortVal(0x378, &dwPortVal, 4); SetPortVal(0x378, 10, 4); // Map physical addresses 0xA0000 - 0xAFFFF into the linear address space // of the application. The value returned from the call to MapPhysToLin is // a linear address corresponding to physical address 0xA0000. In case of // an error, the return value is NULL. pbLinAddr = MapPhysToLin((PBYTE)0xA0000, 65536, &hPhysicalMemory); if (pbLinAddr) { // Now we can use pbLinAddr to access physical address 0xA0000 *pbLinAddr = 10; // When you're done with pbLinAddr, call UnmapPhysicalMemory UnmapPhysicalMemory(hPhysicalMemory, pbLinAddr); } // Instead of using MapPhysToLin, we can use GetPhysLong/SetPhysLong GetPhysLong((PBYTE)0xA0000, &dwMemVal); SetPhysLong((PBYTE)0xA0000, 10); // When you're done using WinIo, call ShutdownWinIo ShutdownWinIo(); } else { printf("Error during initialization of WinIo.\n"); exit(1); }
好象是vc编程编程集锦吧
WinIo - This library allows direct I/O port and physical memory access under Windows 9x/NT/2000 and XP. Version 2.0 provides faster I/O port access, better memory mapping support and can be used from non-administrative accounts under Windows NT/2000 and XP.
"
不过网上有现成的东东,你用GOOGLE搜“WIN2000并口访问”可以得到
DWORD dwMemVal;
bool bResult;
HANDLE hPhysicalMemory;
PBYTE pbLinAddr; // Call InitializeWinIo to initialize the WinIo library. bResult = InitializeWinIo(); //初始化winio 不忘了 if (bResult)
{
// Under Windows NT/2000/XP, after calling InitializeWinIo,
// you can call _inp/_outp instead of using GetPortVal/SetPortVal GetPortVal(0x378, &dwPortVal, 4); SetPortVal(0x378, 10, 4); // Map physical addresses 0xA0000 - 0xAFFFF into the linear address space
// of the application. The value returned from the call to MapPhysToLin is
// a linear address corresponding to physical address 0xA0000. In case of
// an error, the return value is NULL. pbLinAddr = MapPhysToLin((PBYTE)0xA0000, 65536, &hPhysicalMemory); if (pbLinAddr)
{
// Now we can use pbLinAddr to access physical address 0xA0000 *pbLinAddr = 10; // When you're done with pbLinAddr, call UnmapPhysicalMemory UnmapPhysicalMemory(hPhysicalMemory, pbLinAddr);
} // Instead of using MapPhysToLin, we can use GetPhysLong/SetPhysLong GetPhysLong((PBYTE)0xA0000, &dwMemVal); SetPhysLong((PBYTE)0xA0000, 10); // When you're done using WinIo, call ShutdownWinIo ShutdownWinIo();
}
else
{
printf("Error during initialization of WinIo.\n");
exit(1);
}
http://expert.csdn.net/Expert/topic/2545/2545536.xml?temp=.4431116