转自: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. 20160402javaweb 开发模式

    开发案例: 首先,我们确定用xml文件代替数据库,便于测试 建立web工程,基本架构见下图 代码如下: 首先是javabean:User.java package com.dzq.domian; im ...

  2. ASC码 .

    有些时候需要用到一些字符的ASC码,到网上查找太麻烦,现在记录下来. 第128-255号为扩展字符(不常用) Dec Hx Oct Char   Dec Hx Oct Char Dec Hx Oct ...

  3. 04_过滤器Filter_03_多个Filter的执行顺序

    [Filter链] *在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称为一个Filter链. *web服务器根据Filter在web.xml中的注册顺序,决定先调用哪个Fi ...

  4. Codevs 1198 国王游戏 2012年NOIP全国联赛提高组

    1198 国王游戏 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 恰逢 H 国国庆,国王邀 ...

  5. (转) UIALertView的基本用法与UIAlertViewDelegate对对话框的事件处理方法

    首先,视图控制器必须得实现协议UIAlertViewDelegate中的方法,并指定delegate为self,才能使弹出的Alert窗口响应点击事件. 具体代码如下: #import <UIK ...

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

  7. 利用反射生成SQL语句

    // 修改学员信息的方法 public bool ModifyStudent(MODEL.Students model) { // 利用反映获取类对所有属性,用来动态生成SQL语句 StringBui ...

  8. 【实习记】2014-09-01从复杂到简单:一行命令区间查重+长整型在awk中的bug

        9月1号,导出sql文件后,想到了awk,但很复杂.想到了用sed前期处理+python排序比较的区间查重法.编写加调试用了约3小时. 9月2号,编写C代码的sql语句过程中,发现排序可以交m ...

  9. Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法 转

    Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法   同事遇到一个很囧的问题,java调,netwebservice的时候,调用无参数方法成功,调用有参 ...

  10. php Static静态关键字

    静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用.静态属性不允许对象使用->操作符调用. class Car { private static $speed =  ...