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

隨筆 - 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>
            欧美成人一区二区三区片免费| 亚洲国产婷婷香蕉久久久久久99 | 一区二区三区精密机械公司 | 性久久久久久久久久久久| 一区二区三区四区五区视频 | 毛片精品免费在线观看| 欧美成年人在线观看| 亚洲黑丝在线| 亚洲毛片av在线| 先锋影音一区二区三区| 午夜精品福利在线观看| 亚洲专区一二三| 欧美一区国产二区| 噜噜噜在线观看免费视频日韩 | 一区二区精品国产| 欧美一区91| 欧美成人免费网站| 亚洲午夜激情免费视频| 久久精品国产免费看久久精品| 免费久久99精品国产| 国产精品久线观看视频| 亚洲高清资源| 欧美一区二区三区视频在线| 免费在线国产精品| 亚洲一区二区精品| 欧美电影免费网站| 国产在线一区二区三区四区| 一区二区高清视频在线观看| 久久久久国产精品厨房| 亚洲毛片网站| 欧美成人综合在线| 国内不卡一区二区三区| 亚洲女女做受ⅹxx高潮| 亚洲高清三级视频| 久久av二区| 国产精品一区二区三区成人| 日韩一级免费| 另类酷文…触手系列精品集v1小说| 亚洲国产欧美久久| 久久视频在线视频| 激情六月婷婷久久| 久久精品国产第一区二区三区最新章节 | 欧美伦理91i| 亚洲电影第三页| 久久精品色图| 午夜免费电影一区在线观看| 国产精品jizz在线观看美国| 日韩视频中文字幕| 欧美成人日本| 久久野战av| 亚洲第一区在线| 麻豆精品在线视频| 久久久99精品免费观看不卡| 国产一区在线视频| 久久午夜视频| 久久精品国产一区二区三区| 国产综合色一区二区三区| 欧美专区一区二区三区| 亚洲一区视频在线观看视频| 国产精品日本一区二区| 午夜亚洲福利在线老司机| 在线中文字幕日韩| 国产精品欧美一区二区三区奶水| 最新国产成人av网站网址麻豆| 国产精品av一区二区| 国产亚洲精品激情久久| 欧美在线黄色| 久久国产精品一区二区三区四区| 国产亚洲一区在线| 免费在线看成人av| 欧美精品电影| 亚洲欧美视频在线观看| 亚洲欧美欧美一区二区三区| 国产主播一区二区三区| 久久人人97超碰精品888| 久久一区二区三区超碰国产精品| 亚洲国产美女| 99视频精品| 国产在线欧美| 亚洲韩国青草视频| 国产精品美女一区二区| 久久精品一二三| 农村妇女精品| 亚洲欧美影音先锋| 久久人人97超碰国产公开结果| 亚洲激情网址| 中日韩男男gay无套| 狠狠网亚洲精品| 亚洲精品久久视频| 国产精品亚洲精品| 欧美国产日韩一区二区| 亚洲国产日韩欧美| 欧美性猛交99久久久久99按摩| 久久久久高清| 欧美色精品天天在线观看视频| 久久久久在线| 欧美日韩直播| 欧美福利视频一区| 国产精品日韩专区| 亚洲国产专区校园欧美| 国产日韩一区| 亚洲美女视频在线免费观看| 国产主播一区二区| 一本色道久久| 亚洲日韩欧美一区二区在线| 午夜精品久久久久久久男人的天堂 | 激情亚洲一区二区三区四区| 亚洲乱码国产乱码精品精可以看| 国产欧美精品一区二区三区介绍| 欧美激情精品久久久久久久变态 | 国产精品国产三级国产专播品爱网 | 中日韩美女免费视频网站在线观看| 国内精品视频在线播放| 中文精品视频| 99re热精品| 另类图片综合电影| 久久精品国产精品亚洲精品| 亚洲高清在线视频| 一区二区三区日韩精品视频| 在线观看一区二区视频| 亚洲香蕉成视频在线观看 | 亚洲欧美一区二区激情| 欧美国产精品劲爆| 免费中文字幕日韩欧美| 国产乱人伦精品一区二区| 一本久久a久久免费精品不卡| 亚洲国产成人tv| 久久精品女人| 久久青青草原一区二区| 国产精品日韩专区| 亚洲欧美高清| 性色一区二区| 国产欧美一区二区精品婷婷| 亚洲影视在线播放| 欧美一区2区视频在线观看| 国产精品日日摸夜夜添夜夜av| 亚洲最快最全在线视频| 亚洲网址在线| 国产精品免费视频观看| 亚洲天堂网在线观看| 一二三四社区欧美黄| 欧美日韩精品福利| 9久re热视频在线精品| 亚洲视频一区二区| 国产精品美女久久久久久免费| 亚洲无线视频| 久久久久久久久久久久久9999| 国产农村妇女精品| 久久九九国产精品怡红院| 欧美aaa级| 一二三区精品| 国产日韩欧美不卡| 久久夜色精品国产欧美乱| 亚洲国产精品一区二区尤物区| 日韩午夜在线电影| 国产精品成人免费| 欧美综合77777色婷婷| 欧美国产日韩一区二区| 亚洲天堂网在线观看| 国产欧美日韩免费看aⅴ视频| 久久国产精品色婷婷| 最新成人av网站| 欧美在线观看一区二区| 亚洲国产成人91精品| 欧美午夜视频在线| 久久久噜噜噜久久中文字幕色伊伊| 欧美 日韩 国产在线| 亚洲一区中文字幕在线观看| 国产一区在线播放| 欧美日韩一区二区在线视频| 午夜精品久久久久久久久| 亚洲大片精品永久免费| 亚洲在线观看| 亚洲电影网站| 国产精品日韩欧美一区| 免费在线成人| 性欧美1819性猛交| 亚洲破处大片| 久久在线观看视频| 亚洲欧美999| 亚洲精品中文字幕在线| 国产日韩精品视频一区| 欧美激情一二区| 欧美一区二区网站| 99热这里只有成人精品国产| 欧美成人免费全部| 久久精品国产欧美激情| 在线欧美不卡| 99精品久久久| 亚洲最快最全在线视频| 狠狠色狠狠色综合日日tαg | 免费不卡在线观看| 亚洲欧美在线磁力| 136国产福利精品导航网址| 欧美在线观看视频在线 | 美女91精品| 欧美国产1区2区| 性欧美在线看片a免费观看| 亚洲最黄网站| 欧美精品自拍偷拍动漫精品|