转自: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. android 中 系统日期时间的获取

    import    java.text.SimpleDateFormat; SimpleDateFormat    formatter    =   new    SimpleDateFormat   ...

  2. nofollow标签如何使用

    “nofollow”的意思是不传递权重,向网站站长提供了一种方式,即告诉搜索引擎“不要追踪此网页上的链接”或“不要追踪此特定链接”. nofllow的形式 1.<meta name=" ...

  3. desc跟asc

  4. MathType需要安装一个较新版本的MT Extra(True type)字体[转]

    MathType 6.0中MT Extra(TrueType)字体问题在打开MathType6.0时,有时会提示MathType需要安装一个较新版本的MT Extra(TrueType)字体,这是因为 ...

  5. php 5.3 配置mssql笔记

    参考URL  https://docs.moodle.org/29/en/Installing_MSSQL_for_PHP#Using_FreeTDS_on_Debian_Lenny 第一步,下载相应 ...

  6. Visual C++ 打印编程技术-编程基础

    背景: windows产生前,操作系统(如DOS等)都不提供支持图像处理的打印机驱动程序,使得程序员为打印出图像,不得不针对使用的打印机 自己编写设备驱动程序,导致了大量的.不必要的重复开发. 随着w ...

  7. DDX_Text (MFC)

    DDX_Text (MFC) 描述:该DDX_Text功能管理int的转移,UINT,long,DWORD,CString,float, 或 double编辑控件之间的数据在对话框中,表单视图或控制视 ...

  8. asp.net WebService异步

    1 #region 异步测试 2 //委托 3 public delegate void PrintDelegate(string s); 4 [WebMethod] 5 public string ...

  9. 24种设计模式--原型模式【Prototype Pattern】

    今天我们来讲原型模式,这个模式的简单程度是仅次于单例模式和迭代器模式,非常简单,但是要使用好这个模式还有很多注意事项.我们通过一个例子来解释一下什么是原型模式. 现在电子账单越来越流行了,比如你的信用 ...

  10. ubuntu nginx 伪静态 设置

    简单的静态设置 1  vim nginx.conf // 修改nginx配置文件 server { .... root /usr/local/nginx/html; #nginx网站根目录 #下面这个 ...