windows driver 對映小檔案

2021-06-27 00:23:20 字數 2737 閱讀 2328

ntstatus status;

unicode_string strfilesrc = rtl_constant_string(l"\\??\\c:\\網路除錯工具.exe");//幾十kb

unicode_string strfiledest = rtl_constant_string(l"\\??\\c:\\網路除錯工具1.exe");

unicode_string strsectionname = rtl_constant_string(l"\\mysection");//可以是符號連線的方法,也可以用\\mysection,如果不加\\會報錯

handle hfilesrc = null;

handle hfiledest = null;

object_attributes oasrc;

object_attributes oadest;

object_attributes oasection;

io_status_block iosb;

file_network_open_information fnoi;

handle hsection = null;

pvoid paddress = null;

size_t viewsize = 0;

large_integer li_section;

large_integer li_offset;

large_integer li_writeoffset;

initializeobjectattributes(&oasrc, &strfilesrc, obj_kernel_handle, null, null);

initializeobjectattributes(&oadest, &strfiledest, obj_kernel_handle, null, null);

initializeobjectattributes(&oasection, &strsectionname, obj_kernel_handle, null, null);

status = zwcreatefile(&hfilesrc, generic_read, &oasrc, &iosb, null, file_attribute_normal, 0, file_open, file_non_directory_file, null, 0);

if (!nt_success(status))

status = zwqueryfullattributesfile(&oasrc, &fnoi);

if (!nt_success(status))

kdprint(("檔案大小:%i64d", fnoi.allocationsize.quadpart));

li_section.quadpart = fnoi.allocationsize.quadpart;

status = zwcreatesection(&hsection, section_map_read | section_map_write, &oasection, &li_section, page_readwrite, sec_reserve, hfilesrc);//只分配在虛擬記憶體中,不提交到物理記憶體.參考virtualalloc

if (!nt_success(status))

li_offset.quadpart = 0;

status = zwmapviewofsection(hsection,

zwcurrentprocess(),

&paddress,//baseaddress 如果不為null,則分配在指定的位置,有可能失敗

0,//為null,表示可以分配在虛擬記憶體的任意位置,請參考windows核心程式設計裡面的virtualalloc

(ulong)li_section.lowpart,//檔案大小

&li_offset,//從檔案的那裡開始對映,從其實位置開始對映,則li_offset.quadpart = 0;

&viewsize,//對於小檔案,sectionoffset 和 viewsize 都為0

viewunmap,

mem_reserve | mem_large_pages ,

page_readwrite);

if (!nt_success(status))

status = zwcreatefile(&hfiledest,

generic_read | generic_write,

&oadest,

&iosb,

&li_section,//要建立的檔案大小

file_attribute_normal,

0,file_create,

file_non_directory_file,

null,

0);if (!nt_success(status))

li_writeoffset.quadpart = 0;

zwwritefile(hfiledest, null, null, null, &iosb, paddress, viewsize, &li_writeoffset, null);//引數byteoffset為0表示從其實位址開始寫資料,適用於小檔案

zwunmapviewofsection(zwcurrentprocess(), paddress);

zwclose(hsection);

zwclose(hfiledest);

zwclose(hfilesrc);

return status_success;

windows Driver 入門推薦文章

driver development part 1 introduction to drivers driver development part 2 introduction to implementing ioctls driver development part 3 introduction...

動態對映和靜態對映

先說virtualalloc和virtualcopy virtualalloc 首先會從我們的虛擬位址空間中申請 或者說預留 一塊虛擬空間,準備接下來要用它。注意此時,可用的物理記憶體並沒有減少,只是虛擬位址少了一塊可用的區域。真正把這塊之前 reserved 的虛擬空間對映到物理的記憶體區域就是由...

位址對映,儲存器對映

學習乙個事項的時候,注意三點 是什麼,有什麼用 功能 如何配置 實現 操作 1,為了保證 cpu執行指令時可正確訪問 儲存單元 需將使用者程式 中的邏輯 位址轉換 為執行時由機器 直接定址 的實體地址,這一過程稱為位址對映。2,位址對映結構 在tornado target h vmlib.h檔案中 ...