青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 74, 文章 - 0, 評論 - 26, 引用 - 0
數據加載中……

MapPtrToProcess 用法 WINCE驅動分析3 轉

可以使用下面的應用程序代碼測試這個driver,使用evc編譯。

#include <windows.h>

#include<Windev.h>

#include <stdio.h>

#include "objbase.h"

#include "initguid.h"

 

#include "foo.h"

 

//char data1[10];

int  WinMain(void)

{

 

 

    HANDLE hnd;

    COPY_STRUCT cs[1];

    int i;

    //static char data1[10];

  auto char data1[10];

    auto char data2[10];

 

    static char* p1,*p2;

 

    //cs.pBuffer1 = (char *)malloc(10);

    //cs.pBuffer2 = (char*)malloc(10);

    //cs.nLen = 10;

 

    p1 = (char *)LocalAlloc(LPTR,10);

    p2 = (char *)malloc(10);

 

    //cs[0].pBuffer1 = (char *)malloc(10);

    //cs[0].pBuffer2 = (char*)malloc(10);

    cs[0].pBuffer1 = &data1[0];

    cs[0].pBuffer2 = &data2[0];

    cs[0].nLen = 10;

 

    memset(cs[0].pBuffer1,'a',10);

 

    hnd = CreateFile(FOO_DEV_NAME,GENERIC_READ|GENERIC_WRITE,0,NULL,0,0,NULL);

 

    if(hnd==NULL)

    {

           printf("Open device falied!\n");

           return;

    }

 

    DeviceIoControl(hnd,IOCTL_FOO_XER,&cs[0],sizeof(COPY_STRUCT),NULL,0,NULL,NULL);

 

    //for(i=0;i<9;i++)

    //{

           //printf(" %c",*(cs.pBuffer2++));

    //}

 

    printf("\n");

 

    CloseHandle(hnd);

 

//  free(cs[0].pBuffer1);

//  free(cs[0].pBuffer2);

 

 

}

 

可以通過evc的單步調試看結果。好了一切都完成了,我們來看看系統是怎么工作的吧,從應用程序開始,

CreateFile(FOO_DEV_NAME,GENERIC_READ|GENERIC_WRITE,0,NULL,0,0,NULL);

 

會調用到

FOO_Open(DWORD dwContext, DWORD AccessCode, DWORD ShareMode)

 

FOO_DEV_NAME名字定義在foo.h里面。

#define       FOO_DEV_NAME L"Foo1:"

注意后面是 1 ,這個是和注冊表的這一項匹配的

"Index"=dword:1

 

當調用CreateFile發生了什么,slot之間的轉換,一系列系統操作后,調用到我們自己的driver函數FOO_Open,在這個函數里我們返回了一個句柄,它可以用來存儲我們的自己driver的信息。在其它I/O操作中可以使用。

 

Driver什么時候加載的?在注冊表里,device manager會一個個的加載,會調用到FOO_Init函數。這個函數返回一個指針,在調用FOO_Open又傳回來了,這樣我們就可以實現初始化一些自己driver的東西。

 

接著一個重要的函數,

DeviceIoControl(hnd,IOCTL_FOO_XER,&cs[0],sizeof(COPY_STRUCT),NULL,0,NULL,NULL);

調用到

FOO_IOControl

 

走到這里

case IOCTL_FOO_XER:

           if((pInBuf==NULL))

                  {

                         SetLastError(ERROR_INVALID_PARAMETER);

                         break;

                  }

 

                  pcs = (COPY_STRUCT*)pInBuf;

                 

                  __try{

                         pMap1 =  MapPtrToProcess(pcs->pBuffer1,GetCallerProcess());

                         pMap2 =  MapPtrToProcess(pcs->pBuffer2,GetCallerProcess());

 

                         DEBUG_OUT(1, (TEXT("+FOO_IOControl(0x%x,0x%x)\r\n"),pcs->pBuffer1,pcs->pBuffer2));

 

                         memcpy(pcs->pBuffer2,pcs->pBuffer1,pcs->nLen);

 

                         bResult = TRUE;

                         }

                  __except(EXCEPTION_EXECUTE_HANDLER){

                         DEBUG_OUT(1,(TEXT("Exception:FOO_IOCTL\r\n")));

                         break;                         

                  }

                 

                  break;

           default:

                  break;

 

這里又很多東西要研究,

 

從應用程序傳來的參數有, control codeIOCTL_FOO_XER和一個重要的輸入參數&cs[0],它是一個指針。cs 是一個結構體,定義在FOO.H

typedef struct {

    char* pBuffer1;

    char* pBuffer2;

    int nLen;

 

}COPY_STRUCT;

 

而且這個結構體里有兩個指針。

DeviceIoControl 傳過來的指針可以用嗎?它包含的兩個指針可以直接用嗎?

 

按照PB連接幫助文檔看,

The operating system (OS ) manages pointers passed directly as parameters. Drivers must map all pointers contained in structures. DeviceIoControl buffers are often structures that contain data, some of which might be pointers.

You can map a pointer contained in a structure by calling MapPtrToProcess, setting the first parameter to the pointer, and then setting the second parameter to GetCallerProcess.

cs指針已經映射好了,但是它指向的結構里的指針我們需要自己使用MapPtrToProcess函數映射。

這也就是:

                         pMap1 =  MapPtrToProcess(pcs->pBuffer1,GetCallerProcess());

                         pMap2 =  MapPtrToProcess(pcs->pBuffer2,GetCallerProcess());

的由來,可是后面的代碼沒有使用pMap1pMap2。而是直接使用:

memcpy(pcs->pBuffer2,pcs->pBuffer1,pcs->nLen);

 

而且它還工作了,沒有出現exception。很奇怪。我第一次在一個家伙的代碼里看見這種情況,很吃驚,但是它工作的很好,是文檔出錯了?

我們來分析一下,看看應用程序的代碼:

    COPY_STRUCT cs[1];

  auto char data1[10];

    auto char data2[10];

cs結構和data1data2數組都是自動變量,存放在堆棧里。假設這個應用程序被加載到0x18000000位置的slot里,那么他們的地址都是0x18XXXXXX。不熟悉wince memory architecture的可以看看資料,了解一下slot。當調用了

DeviceIoControl,按照文檔的說法,cs指針得到了轉換,因為從應用程序的進程轉到了device.exe進程,而device進程又是當前的運行的進程,被映射到了slot0,系統負責轉換cs指針。而cs包含的pBuffer1pBuffer2是沒有映射不能直接用的。

事實上,我們傳過來的指針根本就是不需要映射,因為他們都是0x18xxxxxx,在應用程序的slot里,所以只要device.exe有訪問應用程序的權限,就可以了。而這個權限,系統已經幫我們設置好了。

 

那什么情況下要自己映射呢?

如果應用程序在定義 data1data2使用static關鍵字,或者使用LocalAllocHeapAlloc的時候,一定要自己映射cs里的指針。

在應用程序里這樣寫:

    cs.pBuffer1 = (char *)malloc(10);

    cs.pBuffer2 = (char*)malloc(10);

    cs.nLen = 10;

如果不使用MapPtrToProcess完成映射,那就出現data abort exception.

 

為什么呢?

因為這些變量都是在堆里分配的,而當應用程序運行時,被映射到slot0,堆的地址也就是處于slot的范圍內,傳遞到device.exe后,device.exe被映射到了slot0,這個時候必須要將應用程序的指針映射回應用程序所在的slot。否則訪問的是device.exe的空間,會發生不可知道的結果。

 

驗證一下上面說的地址分配問題。

 

我們這樣定義

COPY_STRUCT cs[1];

  static char data1[10]; 堆里

  auto char data2[10];   棧里

 

這樣賦值:

 

  cs[0].pBuffer1 = &data1[0];

  cs[0].pBuffer2 = &data2[0];

  cs[0].nLen = 10;

 

調試信息:

cs[0].pBuffer1 = &data1[0];

 

180112D0   ldr       r2, [pc, #0xD0]

180112D4   str       r2, [sp, #0x10]

 

讀取&data1[0]使用的是PC作為基址,而此時的應用程序處于運行階段映射到slot0,那么pc也就在0~01ffffff范圍,我的調試結果是在0x000112D0+8,使用的是arm,流水線機制,當前指令地址+8才是pc值。

 

143:      cs[0].pBuffer2 = &data2[0];

180112D8   add       r0, sp, #0x20

180112DC   str       r0, [sp, #0x14]

讀取&data2[0]采用的是sp作為基址,sp在應用程序加載到slot的時候就確定了的。所以保持了在應用程序slot的值,處于0x18xxxxxx范圍。

 

我們看到因為winceslot機制,我們有時候需要映射,有時候不需要。所以wince文檔說結構里的指針要映射。畢竟你不知道應用程序怎么寫。

當然,你可以根本不映射,只要把那個結構屏蔽調,寫一個STATIC LIBRARY給用戶使用,自己保證使用正確的地址分配就可以了。上面我說的那個家伙就是這么干的。

 

好了,接著

調用:

  CloseHandle(hnd);

程序結束了,完成了一次簡單的拷貝。

 

這個框架完成了,driver的基本接口設計,強調了內存指針的使用問題。但是相對于一個真正的driver,還缺少點東西,就是訪問硬件的方法。下面繼續討論如何訪問硬件。

posted on 2008-08-14 09:28 井泉 閱讀(1527) 評論(0)  編輯 收藏 引用 所屬分類: c code

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产人久久人人人人爽| 一本到12不卡视频在线dvd| 性欧美精品高清| 在线视频一区观看| 亚洲国产精品一区二区第一页 | 国产精品一区毛片| 国产精品一二| 在线精品国产欧美| 亚洲欧洲在线一区| 最新高清无码专区| 亚洲一区在线观看视频| 国产一区二区视频在线观看| 韩国一区二区三区在线观看| 悠悠资源网亚洲青| 亚洲少妇自拍| 欧美二区不卡| 欧美激情小视频| 国产日韩欧美不卡| 亚洲精品日韩综合观看成人91| 亚洲精品美女在线| 欧美在线影院| 亚洲福利视频一区二区| 亚洲欧美视频在线观看| 欧美国产日韩视频| 韩国v欧美v日本v亚洲v | 一区二区三区精品在线| 欧美一区二区三区在线播放| 免费国产自线拍一欧美视频| 激情六月婷婷综合| 欧美成人嫩草网站| 欧美高清在线观看| 一区二区三区四区五区精品视频| 亚洲欧洲在线免费| 国内免费精品永久在线视频| 亚洲国产欧美在线| 欧美成人一区二区三区| 久久久人成影片一区二区三区 | 亚洲免费福利视频| 欧美欧美全黄| 亚洲欧美日韩精品久久久| 午夜精品电影| 亚洲国产你懂的| 在线视频精品一区| 国产精品一区二区女厕厕| 午夜欧美大尺度福利影院在线看| 性欧美大战久久久久久久免费观看| 国产精品亚洲人在线观看| 美女视频黄 久久| 男女av一区三区二区色多| 久久夜色精品国产噜噜av| 亚洲精品久久久久久久久久久久久 | 久久综合成人精品亚洲另类欧美| 91久久久一线二线三线品牌| 亚洲青涩在线| 在线看片日韩| 亚洲综合首页| 一区二区冒白浆视频| 久久精品免视看| 先锋资源久久| 欧美日韩在线免费观看| 欧美国产三级| 亚洲电影成人| 久久精品国产久精国产爱| 亚洲一区三区视频在线观看| 欧美精品久久久久久久免费观看| 久久久精品免费视频| 国产精品亚洲综合天堂夜夜| 一本久道久久综合中文字幕| 9色porny自拍视频一区二区| 麻豆精品精品国产自在97香蕉| 久久视频在线看| 亚洲高清在线观看一区| 久久在线免费观看视频| 巨乳诱惑日韩免费av| 禁久久精品乱码| 久久综合电影| 日韩一二三区视频| 欧美一区二区私人影院日本| 国产精品美女久久久久av超清| 亚洲在线一区| 欧美不卡视频一区| 99亚洲一区二区| 欧美三级电影网| 久久国产视频网| 在线电影国产精品| 老牛影视一区二区三区| 亚洲人成7777| 久久尤物视频| 亚洲尤物影院| 伊人蜜桃色噜噜激情综合| 欧美日韩国产三区| 欧美在线综合| 一本大道久久a久久精品综合| 久久gogo国模裸体人体| 日韩亚洲精品视频| 精品不卡视频| 欧美视频中文一区二区三区在线观看| 欧美在线观看日本一区| 一本大道久久a久久精品综合| 久久夜色精品| 久久琪琪电影院| 久久综合99re88久久爱| 久久久久欧美精品| 久久精品国产第一区二区三区最新章节 | 欧美一区二区三区久久精品茉莉花| 午夜视频久久久| 日韩亚洲成人av在线| 国产精品免费区二区三区观看| 男女av一区三区二区色多| 久久精品欧洲| 久久九九国产精品| 欧美在线观看天堂一区二区三区| 亚洲一区二区三区激情| 中文精品视频一区二区在线观看| 亚洲高清影视| 亚洲国产一区二区三区青草影视| 欧美3dxxxxhd| 日韩一级免费| 午夜在线一区二区| 欧美影视一区| 久久嫩草精品久久久久| 免费成人高清视频| 亚洲激情在线观看视频免费| 亚洲久久视频| 午夜精品av| 欧美激情一区二区三区在线视频观看 | 亚洲综合视频一区| 欧美一区二区三区免费视频| 久久先锋影音av| 亚洲精品影视| 久久久久国产精品一区二区| 欧美国产精品| 国产一区二区三区高清播放| 亚洲精选国产| 久久综合久久综合久久| 一区二区三区久久久| 久久精品国产久精国产一老狼 | 亚洲精品中文字幕在线| 性xx色xx综合久久久xx| 欧美黄色小视频| 一区二区三区亚洲| 午夜欧美不卡精品aaaaa| 亚洲人成艺术| 欧美精品在线免费播放| 亚洲区欧美区| 亚洲第一精品在线| 久久一区欧美| 亚洲电影中文字幕| 亚洲国产你懂的| 欧美激情一区二区三区成人| 欧美v国产在线一区二区三区| 久久久久久久久久久久久9999| 国产女主播在线一区二区| 久久www成人_看片免费不卡| 亚洲视频在线一区| 韩国一区二区三区在线观看| 久久天天躁夜夜躁狠狠躁2022 | 国产欧美视频一区二区三区| 日韩视频在线播放| 中国av一区| 国产精品日韩精品欧美在线| 亚洲欧美清纯在线制服| 毛片基地黄久久久久久天堂| 亚洲美女在线观看| 国产精品你懂的在线欣赏| 久久精品综合网| 亚洲精品在线电影| 久久国产精品久久国产精品| 一区二区三区在线免费播放| 欧美成人精品1314www| 一区二区三区久久| 美女精品国产| 亚欧成人在线| 亚洲日韩欧美视频| 国产乱人伦精品一区二区| 暖暖成人免费视频| 亚洲欧美在线一区| 亚洲区第一页| 久久天天躁狠狠躁夜夜爽蜜月| 一道本一区二区| 在线精品国产成人综合| 国产精品视频男人的天堂| 久久综合激情| 午夜精彩视频在线观看不卡| 亚洲人人精品| 另类综合日韩欧美亚洲| 亚洲欧美在线aaa| 日韩视频在线观看免费| 激情懂色av一区av二区av| 欧美日韩精品在线| 久久综合九色欧美综合狠狠| 亚洲综合日韩在线| 亚洲美女中出| 欧美激情在线观看| 久久香蕉精品| 久久精品亚洲一区二区| 亚洲午夜精品17c| 一本久久青青| 亚洲免费大片| 亚洲伦伦在线|