stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1823回复:5

map出来的地址不能被app用是这个原因吗

楼主#
更多 发布于:2005-01-24 15:38
是不是我在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请求。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2005-01-24 21:14
你可以把虚拟地址查表获得物理地址,而后在你要访问的时候搜索页表找到物理地址,直接对其操作,或者找个空的页目录,自己构造一个虚构的地址指向该物理地址,通过该虚构物理地址来访问内存.
当然最好大小不超过4K,不然的话你需要用大页,普通模式下为4M,PAE模式下为2M......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-24 21:31
你可以把虚拟地址查表获得物理地址,而后在你要访问的时候搜索页表找到物理地址,直接对其操作,或者找个空的页目录,自己构造一个虚构的地址指向该物理地址,通过该虚构物理地址来访问内存.
当然最好大小不超过4K,不然的话你需要用大页,普通模式下为4M,PAE模式下为2M......


我想问的是为什么映射出来的地址不能用?
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-26 11:23
[quote]你可以把虚拟地址查表获得物理地址,而后在你要访问的时候搜索页表找到物理地址,直接对其操作,或者找个空的页目录,自己构造一个虚构的地址指向该物理地址,通过该虚构物理地址来访问内存.
当然最好大小不超过4K,不然的话你需要用大页,普通模式下为4M,PAE模式下为2M......


我想问的是为什么映射出来的地址不能用? [/quote]
用softice看看此时的页表映射,看看这个地址是否在映射的范围内。我估计是你的应用程序端写错了,将它贴出来看看!
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-26 17:14
[quote][quote]你可以把虚拟地址查表获得物理地址,而后在你要访问的时候搜索页表找到物理地址,直接对其操作,或者找个空的页目录,自己构造一个虚构的地址指向该物理地址,通过该虚构物理地址来访问内存.
当然最好大小不超过4K,不然的话你需要用大页,普通模式下为4M,PAE模式下为2M......


我想问的是为什么映射出来的地址不能用? [/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;
}
}
}
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-30 20:16
问题解决,给分罗 :)
游客

返回顶部