转自: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來实现这个功能完全是因为无聊.嘻嘻.

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. typedef unsigned long NTSTATUS;
  5. typedef unsigned short USHORT;
  6. typedef unsigned long ULONG;
  7. typedef unsigned long DWORD;
  8. typedef long LONG;
  9. typedef __int64 LONGLONG;
  10. typedef struct UNICODE_STRING{
  11. USHORT Length;
  12. USHORT MaxLen;
  13. USHORT *Buffer;
  14. } UNICODE_STRING,*PUNICODE_STRING;
  15. #define OBJ_INHERIT             0x00000002L
  16. #define OBJ_PERMANENT           0x00000010L
  17. #define OBJ_EXCLUSIVE           0x00000020L
  18. #define OBJ_CASE_INSENSITIVE    0x00000040L
  19. #define OBJ_OPENIF              0x00000080L
  20. #define OBJ_OPENLINK            0x00000100L
  21. #define OBJ_KERNEL_HANDLE       0x00000200L
  22. #define OBJ_FORCE_ACCESS_CHECK  0x00000400L
  23. #define OBJ_VALID_ATTRIBUTES    0x000007F2L
  24. #define FILE_ATTRIBUTE_NORMAL               0x00000080
  25. #define FILE_SHARE_DELETE                   0x00000004
  26. #define FILE_OPEN_IF                        0x00000003
  27. #define FILE_SYNCHRONOUS_IO_NONALERT        0x00000020
  28. #define GENERIC_WRITE                       (0x40000000L)
  29. #define SYNCHRONIZE                         (0x00100000L)
  30. #define GENERIC_READ                        (0x80000000L)
  31. typedef struct _OBJECT_ATTRIBUTES{
  32. ULONG  Length;
  33. HANDLE  RootDirectory;
  34. PUNICODE_STRING  ObjectName;
  35. ULONG  Attributes;
  36. PVOID  SecurityDescriptor;
  37. PVOID  SecurityQualityOfService;
  38. } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
  39. typedef CONST OBJECT_ATTRIBUTES *PCOBJECT_ATTRIBUTES;
  40. typedef NTSTATUS (__stdcall *ZWDELETEFILE)(
  41. IN POBJECT_ATTRIBUTES  ObjectAttributes);
  42. typedef VOID (__stdcall *RTLINITUNICODESTRING)(
  43. IN OUT PUNICODE_STRING  DestinationString,
  44. IN PCWSTR  SourceString);
  45. typedef struct _IO_STATUS_BLOCK{
  46. DWORD Status;
  47. ULONG Information;
  48. } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
  49. typedef NTSTATUS (__stdcall *ZWCREATEFILE)(
  50. OUT PHANDLE  FileHandle,
  51. IN ACCESS_MASK  DesiredAccess,
  52. IN POBJECT_ATTRIBUTES  ObjectAttributes,
  53. OUT PIO_STATUS_BLOCK  IoStatusBlock,
  54. IN PLARGE_INTEGER  AllocationSize  OPTIONAL,
  55. IN ULONG  FileAttributes,
  56. IN ULONG  ShareAccess,
  57. IN ULONG  CreateDisposition,
  58. IN ULONG  CreateOptions,
  59. IN PVOID  EaBuffer  OPTIONAL,
  60. IN ULONG  EaLength);
  61. typedef VOID (NTAPI *PIO_APC_ROUTINE) (
  62. IN PVOID ApcContext,
  63. IN PIO_STATUS_BLOCK IoStatusBlock,
  64. IN ULONG Reserved);
  65. typedef NTSTATUS (__stdcall *ZWWRITEFILE)(
  66. IN HANDLE  FileHandle,
  67. IN HANDLE  Event  OPTIONAL,
  68. IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
  69. IN PVOID  ApcContext  OPTIONAL,
  70. OUT PIO_STATUS_BLOCK  IoStatusBlock,
  71. IN PVOID  Buffer,
  72. IN ULONG  Length,
  73. IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
  74. IN PULONG  Key  OPTIONAL);
  75. typedef NTSTATUS (__stdcall *ZWCLOSE)(
  76. IN HANDLE  Handle);
  77. int main()
  78. {
  79. HINSTANCE hNtDll;
  80. ZWDELETEFILE ZwDeleteFile;
  81. RTLINITUNICODESTRING RtlInitUnicodeString;
  82. ZWCREATEFILE ZwCreateFile;
  83. ZWWRITEFILE ZwWriteFile;
  84. ZWCLOSE ZwClose;
  85. hNtDll = LoadLibrary ("NTDLL");
  86. if (!hNtDll)
  87. return 0;
  88. ZwDeleteFile = (ZWDELETEFILE)GetProcAddress (hNtDll,"ZwDeleteFile");
  89. RtlInitUnicodeString = (RTLINITUNICODESTRING)GetProcAddress (hNtDll,"RtlInitUnicodeString");
  90. ZwCreateFile = (ZWCREATEFILE)GetProcAddress (hNtDll,"ZwCreateFile");
  91. ZwWriteFile = (ZWWRITEFILE)GetProcAddress (hNtDll,"ZwWriteFile");
  92. ZwClose = (ZWCLOSE)GetProcAddress (hNtDll,"ZwClose");
  93. UNICODE_STRING ObjectName;
  94. RtlInitUnicodeString(&ObjectName,L"//??//C://ForZwFileTest.txt");//記得這裏是要有//??//在前面的,DDK說的.
  95. OBJECT_ATTRIBUTES ObjectAttributes = {
  96. sizeof(OBJECT_ATTRIBUTES),          // Length
  97. NULL,                               // RootDirectory
  98. &ObjectName,                        // ObjectName
  99. OBJ_CASE_INSENSITIVE,               // Attributes
  100. 0,                                  // SecurityDescriptor
  101. NULL,                               // SecurityQualityOfService
  102. };
  103. HANDLE hFile;
  104. PVOID content = "ForZwFileTest";
  105. IO_STATUS_BLOCK IoStatusBlock;
  106. ZwCreateFile(&hFile,
  107. GENERIC_WRITE|SYNCHRONIZE|GENERIC_READ,
  108. &ObjectAttributes,
  109. &IoStatusBlock,
  110. 0,
  111. FILE_ATTRIBUTE_NORMAL,
  112. FILE_SHARE_DELETE,
  113. FILE_OPEN_IF,
  114. FILE_SYNCHRONOUS_IO_NONALERT,
  115. NULL,
  116. 0);
  117. ZwWriteFile(hFile, 0, 0, 0, &IoStatusBlock, content, 12, NULL, NULL);
  118. ZwClose(hFile);
  119. //  ZwDeleteFile(&ObjectAttributes);
  120. FreeLibrary (hNtDll);
  121. return 0;
  122. }

转自:http://blog.csdn.net/cooblily/archive/2007/10/27/1848037.aspx

关于在WIN32调用一些Zw系列的文件操作函数的更多相关文章

  1. python递归、collections系列以及文件操作进阶

    global log 127.0.0.1 local2 daemon maxconn log 127.0.0.1 local2 info defaults log global mode http t ...

  2. Python系列之文件操作、冒泡算法、装饰器、及递归

    文件处理 python对文件进行读写操作的方法与具体步骤,包括打开文件.读取内容.写入文件.文件中的内容定位.及关闭文件释放资源等 open().file(),这个两函数提供了初始化输入\输出(I\O ...

  3. Python学习系列之文件操作

    Pyhton文件打开方式 with= open('文件路径','打开模式') as f:#PS:python3提供了with语句来帮我们自动调用close方法,所以说无论打开文件是否出错都能自动正确的 ...

  4. 第6章 Overlapped I/O, 在你身后变戏法 ---Win32 文件操作函数 -2

    Win32 之中有三个基本的函数用来执行 I/O,它们是:        i CreateFile()        i ReadFile()        i WriteFile()    没有另外 ...

  5. Python系列-python文件操作

    原链接:https://blog.csdn.net/m0_37745438/article/details/79573414 python提供了一系列方法来对文件进行读取.写入等操作 一.打开文件的方 ...

  6. 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版

    <zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...

  7. 《zw版·delphi与halcon系列原创教程》zw版_THImagex控件函数列表

    <zw版·delphi与halcon系列原创教程>zw版_THImagex控件函数列表 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就要7w多行,但核心控件就是两 ...

  8. zw量化交易·实盘操作·系列培训班

    参见: <zw量化交易·实盘操作·系列培训班> http://blog.sina.com.cn/s/blog_7100d4220102w0q5.html

  9. vs2010调用matlab2011下的.m文件

    很幸运在网上找到了采用引擎的方法,用vs2009调用matlab2008下的.m文件:但个人的环境是vs2010+matlab2011;想着二者差不多,故将s2010调用matlab2008拿来试试: ...

随机推荐

  1. requirejs下载与配置

    写在开始: requirejs有中文版api文档,可以访问http://www.requirejs.cn/home.html 下载requirejs 访问http://www.requirejs.cn ...

  2. Codevs 2597 团伙(并查集)

    2597 团伙 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么 ...

  3. zlib压缩解压示例

    #include <stdio.h> #include <string.h> #include <assert.h> #include "zlib.h&q ...

  4. OpenJudge/Poj 1657 Distance on Chessboard

    1.链接地址: http://bailian.openjudge.cn/practice/1657 http://poj.org/problem?id=1657 2.题目: 总时间限制: 1000ms ...

  5. 切换到mint了,纪念一下

  6. HeadFirst设计模式

    oo基础 抽象 封装 多态 继承 oo原则 封装变化 多用组合,少用继承 针对接口编程,不针对实现编程(策略模式) 为交互对象之间的松耦合设计而努力(观察者模式) 对扩展开放,对修改关闭(装饰者模式) ...

  7. URL重写 UrlRewrite

    为什么要URL重写? 1.有利于SEO,带参数的URL权重较低: 2.地址看起来更正规,推广uid 伪静态:看起来像普通页面,而非动态生成的页面. 原理:在Global.asax的Applicatio ...

  8. Nginx中让 重写后的路径 自动增加斜线 /

    http://www.111cn.net/sys/nginx/56067.htm(参考文章) 现在有个这样的需求,在重写的url地址后,自动加斜线 / 例如 xx.com/abc/1-2  (默认ur ...

  9. JavaScript学习总结【12】、JS AJAX应用

    1.AJAX 简介 AJAX(音译为:阿贾克斯) = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技 ...

  10. Lighttpd日志打印格式

    检查lighttpd打印的日志时,有些字段意义模糊,就找了个对照说明,备份一下 原文地址:http://redmine.lighttpd.net/projects/1/wiki/Docs_ModAcc ...