使用WDM驱动实现在NT下读取物理端口,特殊寄存器,物理内存的代码(C++测试代码)

本文详细介绍了在信息技术领域中关键的操作与设备管理过程,包括内存管理、设备读写、映射物理内存等核心内容,同时涉及了从前端到后端、移动开发、游戏开发等多个细分领域的技术实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "libmio.h"
#include "debug.h"

using namespace std;

CLibmio *gpLibio = NULL;

int 
main(
    int argc, 
    char* argv[])
{
  try
  {
    gpLibio = new CLibmio();
  
    char
      szChar[20];
      
    BYTE v1 = 0;
    WORD v2 = 0;
    DWORD 
      v4 = 0,
      dwVersion = 0;
      
    ULARGE_INTEGER 
      v8_1,
      v8_2;
    
    if ( gpLibio->GetVersion(dwVersion) )         printf("1.  PASS. GetVersion = %08X\n", dwVersion);
    if ( gpLibio->GetVersionString(szChar, 20) )  printf("2.  PASS. GetVersionString = %s\n", szChar);
    
    if ( gpLibio->Rdmsr(0x10, v8_1) )     printf("3.  PASS. Rdmsr(TSC=0x10) = %08X, %08X\n", v8_1.HighPart, v8_1.LowPart);
    if ( gpLibio->Rdmsr(0x17, v8_1) )     printf("3.  PASS. Rdmsr(PLATFORM_ID=0x17) = %08X, %08X\n", v8_1.HighPart, v8_1.LowPart);
    if ( gpLibio->Rdmsr(0x1b, v8_1) )     printf("3.  PASS. Rdmsr(APIC_BASE=0x1b) = %08X, %08X\n", v8_1.HighPart, v8_1.LowPart);
    if ( gpLibio->Rdmsr(0x21, v8_1) )     printf("3.  PASS. Rdmsr(PREFETCH_CTL=0x21) = %08X, %08X\n", v8_1.HighPart, v8_1.LowPart);
    if ( gpLibio->Rdmsr(0x2a, v8_1) )     printf("3.  PASS. Rdmsr(HARD_POWERON=0x2a) = %08X, %08X\n", v8_1.HighPart, v8_1.LowPart);
    if ( gpLibio->Rdpmc(0, v8_2) )        printf("6.  PASS. Rdpmc(0) = %08X, %08X\n", v8_2.HighPart, v8_2.LowPart);
                                          printf("7.  PASS. Halt\n");
    
    if ( gpLibio->Inp(0x80, v1) )         printf("8.  PASS. Inp(%02X)\n",   v1);
    if ( gpLibio->Outp(0x80, ++v1) )      printf("9.  PASS. Outp(%02X)\n",  v1);
    if ( gpLibio->Inp(0x80, v1) )         printf("10. PASS. Inp(%02X)\n",   v1);
    if ( gpLibio->Outp(0x80, --v1) )      printf("11. PASS. Outp(%02X)\n",  v1);
    if ( gpLibio->Inp(0x80, v1) )         printf("12. PASS. Inp(%02X)\n",   v1);
    
    if ( gpLibio->Inp(0x80, v2) )         printf("13. PASS. Inp(%04X)\n",   v2);
    if ( gpLibio->Outp(0x80, ++v2) )      printf("14. PASS. Outp(%04X)\n",  v2);
    if ( gpLibio->Inp(0x80, v2) )         printf("15. PASS. Inp(%04X)\n",   v2);
    if ( gpLibio->Outp(0x80, --v2) )      printf("16. PASS. Outp(%04X)\n",  v2);
    if ( gpLibio->Inp(0x80, v2) )         printf("17. PASS. Inp(%04X)\n",   v2);
    
    if ( gpLibio->Inp(0x80, v4) )         printf("18. PASS. Inp(%08X)\n",   v4);
    if ( gpLibio->Outp(0x80, ++v4) )      printf("19. PASS. Outp(%08X)\n",  v4);
    if ( gpLibio->Inp(0x80, v4) )         printf("20. PASS. Inp(%08X)\n",   v4);
    if ( gpLibio->Outp(0x80, --v4) )      printf("21. PASS. Outp(%08X)\n",  v4);
    if ( gpLibio->Inp(0x80, v4) )         printf("22. PASS. Inp(%08X)\n",   v4);  
    
    if ( gpLibio->ReadPort(0x80, v1) )    printf("23. PASS. ReadPort(%02X)\n",  v1);
    if ( gpLibio->WritePort(0x80, ++v1) ) printf("24. PASS. WritePort(%02X)\n", v1);
    if ( gpLibio->ReadPort(0x80, v1) )    printf("25. PASS. ReadPort(%02X)\n",  v1);
    if ( gpLibio->WritePort(0x80, --v1) ) printf("26. PASS. WritePort(%02X)\n", v1);
    if ( gpLibio->ReadPort(0x80, v1) )    printf("27. PASS. ReadPort(%02X)\n",  v1);
    
    if ( gpLibio->ReadPort(0x80, v2) )    printf("28. PASS. ReadPort(%04X)\n",  v2);
    if ( gpLibio->WritePort(0x80, ++v2) ) printf("29. PASS. WritePort(%04X)\n", v2);
    if ( gpLibio->ReadPort(0x80, v2) )    printf("30. PASS. ReadPort(%04X)\n",  v2);
    if ( gpLibio->WritePort(0x80, --v2) ) printf("31. PASS. WritePort(%04X)\n", v2);
    if ( gpLibio->ReadPort(0x80, v2) )    printf("32. PASS. ReadPort(%04X)\n",  v2);
    
    if ( gpLibio->ReadPort(0x82, v4) )    printf("33. PASS. ReadPort(%08X)\n",  v4);
    if ( gpLibio->WritePort(0x80, ++v4) ) printf("34. PASS. WritePort(%08X)\n", v4);
    if ( gpLibio->ReadPort(0x82, v4) )    printf("35. PASS. ReadPort(%08X)\n",  v4);
    if ( gpLibio->WritePort(0x80, --v4) ) printf("36. PASS. WritePort(%08X)\n", v4);
    if ( gpLibio->ReadPort(0x82, v4) )    printf("37. PASS. ReadPort(%08X)\n",  v4);  
    
    if ( gpLibio->PciReadConfig(0x4, 0x0, 0x0, 0x0C, &v4, sizeof(DWORD)) )  printf("38. PASS. PciReadConfig(%08X)\n",  v4++);  
    if ( gpLibio->PciWriteConfig(0x4, 0x0, 0x0, 0x0C, &v4, sizeof(DWORD)) ) printf("39. PASS. PciWriteConfig(%08X)\n",  v4);   
    if ( gpLibio->PciReadConfig(0x4, 0x0, 0x0, 0x0C, &v4, sizeof(DWORD)) )  printf("40. PASS. PciReadConfig(%08X)\n",  v4--);
    if ( gpLibio->PciWriteConfig(0x4, 0x0, 0x0, 0x0C, &v4, sizeof(DWORD)) ) printf("41. PASS. PciWriteConfig(%08X)\n",  v4); 
    if ( gpLibio->PciReadConfig(0x4, 0x0, 0x0, 0x0C, &v4, sizeof(DWORD)) )  printf("42. PASS. PciReadConfig(%08X)\n",  v4); 
    
    if ( (v4 = (DWORD)gpLibio->MapPhyMemory(reinterpret_cast<LPVOID>(0x3400), 0x04)) )  printf("43. PASS. MapPhyMemory(%p = %08X)\n",  v4, *((DWORD*)v4)); 
    if ( gpLibio->UnmapPhyMemory(reinterpret_cast<LPVOID>(v4)) )  printf("44. PASS. UnmapPhyMemory(%p)\n",  v4); 
    
    if ( gpLibio->ReadPhyMemory(reinterpret_cast<LPVOID>(0x3400), &v4, 0x04) )  printf("45. PASS. ReadPhyMemory(%p)\n",  v4++); 
    if ( gpLibio->WritePhyMemory(reinterpret_cast<LPVOID>(0x3400), &v4, 0x04) ) printf("46. PASS. WritePhyMemory(%p)\n",  v4); 
    if ( gpLibio->ReadPhyMemory(reinterpret_cast<LPVOID>(0x3400), &v4, 0x04) )  printf("47. PASS. ReadPhyMemory(%p)\n",  v4--); 
    if ( gpLibio->WritePhyMemory(reinterpret_cast<LPVOID>(0x3400), &v4, 0x04) ) printf("48. PASS. WritePhyMemory(%p)\n",  v4); 
    
//    pci_enum_device(PCI_DEV_BASE_CLASS_STORAGE, PCI_DEV_SUB_CLASS_IDE, device_enum_proc);
//    pci_enum_device(PCI_DEV_BASE_CLASS_STORAGE, PCI_DEV_SUB_CLASS_AHCI, device_enum_proc);
    
  }
  catch(CLibmioException *e)
  {
    e->ShowError();
    delete e;
  }
  catch(...)
  {
    cerr << "Unknown exception." << endl;
  }
  
  if ( gpLibio )
    delete gpLibio;
  gpLibio = NULL;

  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值