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檔案中 ...