阅读:1212回复:3
物理地址的问题!!在win98 下面得到的物理地址, 用什么样的api才能把它应设成虚拟地址。 这个操作在应用程序中怎么做???(ring3) |
|
|
沙发#
发布于:2002-10-08 19:29
厉害 :o
|
|
板凳#
发布于:2002-10-08 19:10
虚拟地址转换到物理地址可以通过址
ULONG LinearAddressToPhysicalAddress(ULONG lAddress) { unsigned int *pAddr; unsigned int *PageDirectoryEntry=(unsigned int *)0xC0300000; unsigned int *PageTableEntry=(unsigned int *)0xC0000000; //判断页目录是否有效,第0位(P)为存在位,请参阅相关书籍 if((!(PageDirectoryEntry[lAddress>>22]&0xFFFFF000)) &&(!(PageDirectoryEntry[lAddress>>22]&0x00000001))) return 0; //@(C0000000h+(LA&0xFFFFF000)>>10d)&0fffff000h+PO 见上叙述 pAddr=(int *)((int)PageTableEntry+((lAddress&0xFFFFF000)>>10)); if((*pAddr)&1) return ((*pAddr) &0xFFFFF000) |(lAddress&0x00000FFF); return 0; } 但是物理地址到虚拟地址就只有遍历了。 void PhysicalAddressToLinearAddress(ULONG pAddress) { unsigned int *pAddr; unsigned int *PageDirectoryEntry=(unsigned int *)0xC0300000; unsigned int *PageTableEntry=(unsigned int *)0xC0000000; int i,j; DbgPrint(\"\\n\"); for(i=0;i<1024;i++) if((PageDirectoryEntry&0xFFFFF000)&&(PageDirectoryEntry&0x00000001)) for(j=0;j<1024;j++){ pAddr=(int *)((int)PageTableEntry+i*4096+j*4); if((*pAddr)&0x00000001) if(((*pAddr)&0xFFFFF000)==(pAddress&0xFFFFF000)) DbgPrint(\"%08X\\n\", ((i*4*1024*1024+j*4*1024)&0xFFFFF000)|(pAddress&0x00000FFF)); } } |
|
地板#
发布于:2002-10-08 11:34
呃
|
|
|