阅读:1823回复:5
map出来的地址不能被app用是这个原因吗
是不是我在MmMapLockedPages的时候当前的context和我的那个app不一样,所以产生的地址对app无效啊?
我是在app发起的DeviceIoControl后,在它的iocontrol routine里做的这个map。 有什么办法确定map地址的时候是处于我想要的app的context吗? 大家救救我吧,share内存的问题已经困扰我好久了:( 其实我要做的是一个smart card reader的驱动。 当driver和一些pcsc的app通信时,我有一个.exe来模拟一张卡,所以share的memory必须事先拿到,不能每次通过DeviceIoControl的方式来拿,因为那个时候已经有另外的要和driver通信的irp挂着呢,我就是在处理那个ioctrl的时候希望从它那里拿到数据并在memory里share出来传给我的.exe,然后我的.exe写数据到share的memory,最后在结束调用我的driver的io请求。 |
|
沙发#
发布于:2005-01-24 21:14
你可以把虚拟地址查表获得物理地址,而后在你要访问的时候搜索页表找到物理地址,直接对其操作,或者找个空的页目录,自己构造一个虚构的地址指向该物理地址,通过该虚构物理地址来访问内存.
当然最好大小不超过4K,不然的话你需要用大页,普通模式下为4M,PAE模式下为2M...... |
|
|
板凳#
发布于:2005-01-24 21:31
你可以把虚拟地址查表获得物理地址,而后在你要访问的时候搜索页表找到物理地址,直接对其操作,或者找个空的页目录,自己构造一个虚构的地址指向该物理地址,通过该虚构物理地址来访问内存. 我想问的是为什么映射出来的地址不能用? |
|
地板#
发布于:2005-01-26 11:23
[quote]你可以把虚拟地址查表获得物理地址,而后在你要访问的时候搜索页表找到物理地址,直接对其操作,或者找个空的页目录,自己构造一个虚构的地址指向该物理地址,通过该虚构物理地址来访问内存. 我想问的是为什么映射出来的地址不能用? [/quote] 用softice看看此时的页表映射,看看这个地址是否在映射的范围内。我估计是你的应用程序端写错了,将它贴出来看看! |
|
|
地下室#
发布于:2005-01-26 17:14
[quote][quote]你可以把虚拟地址查表获得物理地址,而后在你要访问的时候搜索页表找到物理地址,直接对其操作,或者找个空的页目录,自己构造一个虚构的地址指向该物理地址,通过该虚构物理地址来访问内存. 我想问的是为什么映射出来的地址不能用? [/quote] 用softice看看此时的页表映射,看看这个地址是否在映射的范围内。我估计是你的应用程序端写错了,将它贴出来看看! [/quote] 应用程序如下: #include <stdio.h> #include <conio.h> #include <winscard.h> #include <string.h> #define EVENT_EXE_RUN L"STONE_EXE_RUN" #define EVENT_EXE_RETURN L"STONE_EXE_RETURN" #define IOCTL_CREATE_BEE SCARD_CTL_CODE( 3001 ) BOOL result; HANDLE hEventExeRun; HANDLE hEventExeReturn; PVOID pBeeAddress; unsigned char exchangeBuffer[sizeof(PVOID)]; LONG dwReturn = 0; SCARDCONTEXT hSC = NULL; SCARDHANDLE hCardHandle = NULL; DWORD dwAP = 0; CHAR Stone_Reader[] = "STONE ABC 0"; DWORD dwReturnBytes = 0; unsigned char abc[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A}; int operateWithBee(void) { //int i; printf("The top ten bytes get from reader is :\n"); printf("%X\n",((unsigned char*)pBeeAddress)[0]); memcpy(pBeeAddress,abc,5); printf("shit get!\n"); for(i=0;i<10;i++) *(pBeeAddress+i) = i; return 1; } void main(void) { ///////////////////////////////////////////////////////////////// if ((dwReturn = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hSC)) == SCARD_S_SUCCESS) { // I will point our stone reader DIRECTLY // Our card support T0 ISO 7816 protocol ONLY if((dwReturn=SCardConnect(hSC,(LPCSTR)&Stone_Reader,SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0, &hCardHandle, &dwAP)) == SCARD_S_SUCCESS) { //check hCardHandle != NULL if (dwAP == SCARD_PROTOCOL_T0) { // Let's try to start CreateEvent via calling VENDOR_IOCTL code if ((dwReturn = SCardControl(hCardHandle, IOCTL_CREATE_BEE, NULL, 0, exchangeBuffer, sizeof(PVOID), &dwReturnBytes)) == SCARD_S_SUCCESS) { if(dwReturnBytes != sizeof(PVOID)) printf("return Length is not sizeof(PVOID)\n"); else { memcpy(&pBeeAddress,exchangeBuffer,sizeof(PVOID)); printf("the address in user mode is %X\n",pBeeAddress); printf("BEE EVENTs were created with SCardControl reguest.\n"); } } else printf("BEE SCardControl Failed,most likely BEE EVENTs were not created!\n"); } else printf("Failed SCardConnect, unsupported protocol, error %#X\n",dwReturn); SCardDisconnect(hSC, SCARD_LEAVE_CARD); } else { if (dwReturn == SCARD_W_REMOVED_CARD) printf("Failed SCardConnect, virtual smartcard was removed \n from the virtual reader before, error %#X\n", dwReturn); if (dwReturn == SCARD_E_UNKNOWN_CARD) printf(" SCardConnect returned error : SCARD_E_UNKNOWN_CARD\n"); else printf("Failed SCardConnect, error %#X\n",dwReturn); } if (hSC != NULL) if(SCardReleaseContext(hSC) != SCARD_S_SUCCESS) printf("SCardReleaseContext Failed!\n"); } else { printf("Failed SCardEstablishContext, error %#X\n",dwReturn); getch(); return; } ///////////////////////////////////////////////////////////////// hEventExeRun = OpenEventW(EVENT_ALL_ACCESS, NULL, EVENT_EXE_RUN); if (hEventExeRun == NULL) { printf("EVENT_EXE_RUN has not been created by driver! Something wrong with driver.\n"); getch(); return; } hEventExeReturn = OpenEventW(EVENT_ALL_ACCESS, NULL, EVENT_EXE_RETURN); if (hEventExeReturn == NULL) { printf("EVENT_EXE_RETURN has not been created by driver! Something wrong with driver.\n"); getch(); return; } while(hEventExeRun != NULL) { WaitForSingleObject(hEventExeRun,INFINITE); //read from bee, do operations, and write data back into bee if (operateWithBee() == 0) { printf("something error while operate with bee!\n"); return; } result = ResetEvent(hEventExeRun);// if hEventRun is an auto-reset Event, this line has no effect if (result == FALSE) { printf("reset event -- EVENT_EXE_RUN failed!\n"); getch(); return; } result = SetEvent(hEventExeReturn);// to make the driver goes on if (result == FALSE) { printf("set event -- EVENT_EXE_RETURN failed!\n"); getch(); return; } } } |
|
5楼#
发布于:2005-01-30 20:16
问题解决,给分罗 :)
|
|