关于在WIN32调用一些Zw系列的文件操作函数
转自:http://blog.csdn.net/cooblily/archive/2007/10/27/1848037.aspx
都好久沒上來写文章了,都不知道做什么好,結果还是学写了一下用Native API的程序,這些API的原型当然久在DDK里面找啦,不过因为NTDLL.DLL有导出啊,所以可以LoadLibrary调入这个动态连接文件,再GetProcAddress找到相应的API的地址,然后当然就可以调用啦.
整個过程最麻烦的就是要将DDK翻来翻去找到要用到的函数原型,函数所用到的結构,和一些宏.复制到程序裏面,好啦,以下是我学习的成果.
以下代码是在C:中创建一个ForZwFileTest.txt的文件并写入內容,然後删除.其实都沒什么用的,反正有微軟公开的API不用,而用這些沒公开的API來实现这个功能完全是因为无聊.嘻嘻.
- #include <windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- typedef unsigned long NTSTATUS;
- typedef unsigned short USHORT;
- typedef unsigned long ULONG;
- typedef unsigned long DWORD;
- typedef long LONG;
- typedef __int64 LONGLONG;
- typedef struct UNICODE_STRING{
- USHORT Length;
- USHORT MaxLen;
- USHORT *Buffer;
- } UNICODE_STRING,*PUNICODE_STRING;
- #define OBJ_INHERIT 0x00000002L
- #define OBJ_PERMANENT 0x00000010L
- #define OBJ_EXCLUSIVE 0x00000020L
- #define OBJ_CASE_INSENSITIVE 0x00000040L
- #define OBJ_OPENIF 0x00000080L
- #define OBJ_OPENLINK 0x00000100L
- #define OBJ_KERNEL_HANDLE 0x00000200L
- #define OBJ_FORCE_ACCESS_CHECK 0x00000400L
- #define OBJ_VALID_ATTRIBUTES 0x000007F2L
- #define FILE_ATTRIBUTE_NORMAL 0x00000080
- #define FILE_SHARE_DELETE 0x00000004
- #define FILE_OPEN_IF 0x00000003
- #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
- #define GENERIC_WRITE (0x40000000L)
- #define SYNCHRONIZE (0x00100000L)
- #define GENERIC_READ (0x80000000L)
- typedef struct _OBJECT_ATTRIBUTES{
- ULONG Length;
- HANDLE RootDirectory;
- PUNICODE_STRING ObjectName;
- ULONG Attributes;
- PVOID SecurityDescriptor;
- PVOID SecurityQualityOfService;
- } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
- typedef CONST OBJECT_ATTRIBUTES *PCOBJECT_ATTRIBUTES;
- typedef NTSTATUS (__stdcall *ZWDELETEFILE)(
- IN POBJECT_ATTRIBUTES ObjectAttributes);
- typedef VOID (__stdcall *RTLINITUNICODESTRING)(
- IN OUT PUNICODE_STRING DestinationString,
- IN PCWSTR SourceString);
- typedef struct _IO_STATUS_BLOCK{
- DWORD Status;
- ULONG Information;
- } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
- typedef NTSTATUS (__stdcall *ZWCREATEFILE)(
- OUT PHANDLE FileHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- IN PLARGE_INTEGER AllocationSize OPTIONAL,
- IN ULONG FileAttributes,
- IN ULONG ShareAccess,
- IN ULONG CreateDisposition,
- IN ULONG CreateOptions,
- IN PVOID EaBuffer OPTIONAL,
- IN ULONG EaLength);
- typedef VOID (NTAPI *PIO_APC_ROUTINE) (
- IN PVOID ApcContext,
- IN PIO_STATUS_BLOCK IoStatusBlock,
- IN ULONG Reserved);
- typedef NTSTATUS (__stdcall *ZWWRITEFILE)(
- IN HANDLE FileHandle,
- IN HANDLE Event OPTIONAL,
- IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
- IN PVOID ApcContext OPTIONAL,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- IN PVOID Buffer,
- IN ULONG Length,
- IN PLARGE_INTEGER ByteOffset OPTIONAL,
- IN PULONG Key OPTIONAL);
- typedef NTSTATUS (__stdcall *ZWCLOSE)(
- IN HANDLE Handle);
- int main()
- {
- HINSTANCE hNtDll;
- ZWDELETEFILE ZwDeleteFile;
- RTLINITUNICODESTRING RtlInitUnicodeString;
- ZWCREATEFILE ZwCreateFile;
- ZWWRITEFILE ZwWriteFile;
- ZWCLOSE ZwClose;
- hNtDll = LoadLibrary ("NTDLL");
- if (!hNtDll)
- return 0;
- ZwDeleteFile = (ZWDELETEFILE)GetProcAddress (hNtDll,"ZwDeleteFile");
- RtlInitUnicodeString = (RTLINITUNICODESTRING)GetProcAddress (hNtDll,"RtlInitUnicodeString");
- ZwCreateFile = (ZWCREATEFILE)GetProcAddress (hNtDll,"ZwCreateFile");
- ZwWriteFile = (ZWWRITEFILE)GetProcAddress (hNtDll,"ZwWriteFile");
- ZwClose = (ZWCLOSE)GetProcAddress (hNtDll,"ZwClose");
- UNICODE_STRING ObjectName;
- RtlInitUnicodeString(&ObjectName,L"//??//C://ForZwFileTest.txt");//記得這裏是要有//??//在前面的,DDK說的.
- OBJECT_ATTRIBUTES ObjectAttributes = {
- sizeof(OBJECT_ATTRIBUTES), // Length
- NULL, // RootDirectory
- &ObjectName, // ObjectName
- OBJ_CASE_INSENSITIVE, // Attributes
- 0, // SecurityDescriptor
- NULL, // SecurityQualityOfService
- };
- HANDLE hFile;
- PVOID content = "ForZwFileTest";
- IO_STATUS_BLOCK IoStatusBlock;
- ZwCreateFile(&hFile,
- GENERIC_WRITE|SYNCHRONIZE|GENERIC_READ,
- &ObjectAttributes,
- &IoStatusBlock,
- 0,
- FILE_ATTRIBUTE_NORMAL,
- FILE_SHARE_DELETE,
- FILE_OPEN_IF,
- FILE_SYNCHRONOUS_IO_NONALERT,
- NULL,
- 0);
- ZwWriteFile(hFile, 0, 0, 0, &IoStatusBlock, content, 12, NULL, NULL);
- ZwClose(hFile);
- // ZwDeleteFile(&ObjectAttributes);
- FreeLibrary (hNtDll);
- return 0;
- }
转自:http://blog.csdn.net/cooblily/archive/2007/10/27/1848037.aspx
关于在WIN32调用一些Zw系列的文件操作函数的更多相关文章
- python递归、collections系列以及文件操作进阶
global log 127.0.0.1 local2 daemon maxconn log 127.0.0.1 local2 info defaults log global mode http t ...
- Python系列之文件操作、冒泡算法、装饰器、及递归
文件处理 python对文件进行读写操作的方法与具体步骤,包括打开文件.读取内容.写入文件.文件中的内容定位.及关闭文件释放资源等 open().file(),这个两函数提供了初始化输入\输出(I\O ...
- Python学习系列之文件操作
Pyhton文件打开方式 with= open('文件路径','打开模式') as f:#PS:python3提供了with语句来帮我们自动调用close方法,所以说无论打开文件是否出错都能自动正确的 ...
- 第6章 Overlapped I/O, 在你身后变戏法 ---Win32 文件操作函数 -2
Win32 之中有三个基本的函数用来执行 I/O,它们是: i CreateFile() i ReadFile() i WriteFile() 没有另外 ...
- Python系列-python文件操作
原链接:https://blog.csdn.net/m0_37745438/article/details/79573414 python提供了一系列方法来对文件进行读取.写入等操作 一.打开文件的方 ...
- 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版
<zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...
- 《zw版·delphi与halcon系列原创教程》zw版_THImagex控件函数列表
<zw版·delphi与halcon系列原创教程>zw版_THImagex控件函数列表 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就要7w多行,但核心控件就是两 ...
- zw量化交易·实盘操作·系列培训班
参见: <zw量化交易·实盘操作·系列培训班> http://blog.sina.com.cn/s/blog_7100d4220102w0q5.html
- vs2010调用matlab2011下的.m文件
很幸运在网上找到了采用引擎的方法,用vs2009调用matlab2008下的.m文件:但个人的环境是vs2010+matlab2011;想着二者差不多,故将s2010调用matlab2008拿来试试: ...
随机推荐
- requirejs下载与配置
写在开始: requirejs有中文版api文档,可以访问http://www.requirejs.cn/home.html 下载requirejs 访问http://www.requirejs.cn ...
- Codevs 2597 团伙(并查集)
2597 团伙 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么 ...
- zlib压缩解压示例
#include <stdio.h> #include <string.h> #include <assert.h> #include "zlib.h&q ...
- OpenJudge/Poj 1657 Distance on Chessboard
1.链接地址: http://bailian.openjudge.cn/practice/1657 http://poj.org/problem?id=1657 2.题目: 总时间限制: 1000ms ...
- 切换到mint了,纪念一下
- HeadFirst设计模式
oo基础 抽象 封装 多态 继承 oo原则 封装变化 多用组合,少用继承 针对接口编程,不针对实现编程(策略模式) 为交互对象之间的松耦合设计而努力(观察者模式) 对扩展开放,对修改关闭(装饰者模式) ...
- URL重写 UrlRewrite
为什么要URL重写? 1.有利于SEO,带参数的URL权重较低: 2.地址看起来更正规,推广uid 伪静态:看起来像普通页面,而非动态生成的页面. 原理:在Global.asax的Applicatio ...
- Nginx中让 重写后的路径 自动增加斜线 /
http://www.111cn.net/sys/nginx/56067.htm(参考文章) 现在有个这样的需求,在重写的url地址后,自动加斜线 / 例如 xx.com/abc/1-2 (默认ur ...
- JavaScript学习总结【12】、JS AJAX应用
1.AJAX 简介 AJAX(音译为:阿贾克斯) = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技 ...
- Lighttpd日志打印格式
检查lighttpd打印的日志时,有些字段意义模糊,就找了个对照说明,备份一下 原文地址:http://redmine.lighttpd.net/projects/1/wiki/Docs_ModAcc ...