ddk Windows内核函数

对 Windows驱动开发技术详解 第六章的(Windows内核函数)自我理解
2009年09月17日 星期四 23:11

对 Windows驱动开发技术详解 第六章的(Windows内核函数)自我理解

BY:ALALMN—飞龙   QQ:316118740     BLOG:http://hi.baidu.com/alalmn

其实这章主要就是讲函数   DDK有自己的函数   跟SDK一样     编写DDK使用DDK提供的函数就OK了
///
ASCII字符串和宽字符串
ASCII字符构造
char* str1="abc";
打印ASCII字符串
char *string="hello";
KdPrint("%s/n",string); //注意是小写%s
/
UNICODE字符构造
wchar_t *str2=L"abc";
打印宽字符串
WCHAR *string=L"hello";
KdPrint("%S/n",string); //注意是大写%S

///
ANSI_STRING字符串和UNICODE_STRING字符串
ASCII字符串进行了封装
typedef struct _STRING{
USHORT Length;          //字符的长度。
USHORT MaximumLength;   //整个字符串缓冲区的最大长度。
PCHAR   Buffer;          //缓冲区的指针。
} STRING;
输出字符串
ANSI_STRING ansiString;
KdPrint("%Z/n",&ansiString);    //注意是%Z

UNICODE_STRING宽字符串封装
typedef struct _UNICODE_STRING {
USHORT Length;          //字符的长度,单位是字节。如果是N个字符,那么Length等于N的2倍。
USHORT MaximumLength;   //整个字符串缓冲区的最大长度,单位也是字节。
PWSTR Buffer;           //缓冲区的指针。
} UNICODE_STRING *PUNICODE_STRING;
输出字符串
UNICODE_STRING ansiString;
KdPrint("%wZ/n",&ansiString);    //注意是%wZ

///
字符初始化与销毁
初始化ANSI_STRING字符串
VOID
RtlInitAnsiString(
    IN OUT PANSI_STRING DestinationString,   //要初始化的ANSI_STRING字符串
    IN PCSZ SourceString //字符串的内容
    );
初始化UNICODE_STRING字符串
VOID
RtlInitUnicodeString(
    IN OUT PUNICODE_STRING DestinationString, //要初始化的UNICODE_STRING字符串
    IN PCWSTR SourceString //字符串的内容
    );

///
字符串复制
ANSI_STRING字符串复制
VOID
RtlCopyString(
    IN OUT PSTRING DestinationString, //目的字符串。
    IN PSTRING SourceString OPTIONAL //源字符串。
    );
UNICODE_STRING字符串复制
VOID
RtlCopyUnicodeString(
    IN OUT PUNICODE_STRING DestinationString, //目的字符串。
    IN PUNICODE_STRING SourceString //源字符串。
    );

///
字符串比较
ANSI_STRING字符串
LONG
RtlCompareString(
    IN PSTRING String1,          //要比较的第一个字符串。
    IN PSTRING String2,          //要比较的第二个字符串。
    BOOLEAN CaseInSensitive      //是否对大小写敏感。
    );
UNICODE_STRING字符串
LONG
RtlCompareUnicodeString(
    IN PUNICODE_STRING String1, //要比较的第一个字符串。
    IN PUNICODE_STRING String2, //要比较的第二个字符串。
    IN BOOLEAN CaseInSensitive   //是否对大小写敏感。
    );

///
字符串转化成大写
ANSI_STRING字符串转化成大写
VOID
RtlUpperString(
    IN OUT PSTRING DestinationString,   //目的字符串。
    IN PSTRING SourceString             //源字符串。
    );
UNICODE_STRING字符串转化成大写
NTSTATUS
RtlUpcaseUnicodeString(
    IN OUT PUNICODE_STRING DestinationString OPTIONAL,    //目的字符串。
    IN PCUNICODE_STRING SourceString,       //源字符串。
    IN BOOLEAN AllocateDestinationString    //是否为目的字符串分配内存。
    );

///
字符串与整型数字相互转换
UNICODE_STRING字符串转化成整数
NTSTATUS
RtlUnicodeStringToInteger(
    IN PUNICODE_STRING String,     //需要转换的字符串。
    IN ULONG Base OPTIONAL,       //转换的数的进制(如2,8,10,16)。
    OUT PULONG Value               //需要转换的数字。
    );
将整数转化成UNICODE_STRING字符串
NTSTATUS
RtlIntegerToUnicodeString(
    IN ULONG Value,                //需要转换的数字。
    IN ULONG Base OPTIONAL,       //转换的数的进制(如2,8,10,16)。
    IN OUT PUNICODE_STRING String //需要转换的字符串。
    );

///
内核模式下的文件操作
文件创建
NTSTATUS
ZwCreateFile(
    OUT PHANDLE FileHandle,                       //返回打开文件的句柄
    IN ACCESS_MASK DesiredAccess,                 //对打开文件操作的描述,读,写或者其他。一般指定GENERIC_READ或者GENERIC_WRITE。
    IN POBJECT_ATTRIBUTES ObjectAttributes,       //是OBJECT_ATTRIBUTES结构地址,该结构包含要打开的文件名。
    OUT PIO_STATUS_BLOCK IoStatusBlock,           //指向一个IO_STATUS_BLOCK结构,该结构接收ZwCreateFile操作的结果状态。
    IN PLARGE_INTEGER AllocationSize OPTIONAL,   //是一个指针,指向一个64位整数,该数指定文件初始分配时的大小。该参数仅关系到创建或重写文件操作,如果忽略它(如笔者在这里所做的),那么文件长度将从0开始,并随着写入而增长。
    IN ULONG FileAttributes,                      //0或FILE_ATTRIBUTE_NORML,指定新创建文件的属性。
    IN ULONG ShareAccess,                         //FILE_SHARE_READ或0,指定文件的共享方式。如果仅为读数据而打开文件,则可以与其他线程同时读取该文件。如果为写数据而打开文件,可能不希望其他线程访问该文件。
    IN ULONG CreateDisposition,                   //FILE_OPEN或FILE_OVERWRITE_IF,表明当指定文件存在或不存在时应如何处理。
    IN ULONG CreateOptions,                       //FILE_SYNCHRONOUS_IO_NONALERT,指定控制打开操作和句柄使用的附加标志位。
    IN PVOID EaBuffer OPTIONAL,                  //一个指针,指向可选的扩展属性区。
    IN ULONG EaLength                             //扩展属性区的长度。
    );
DDK提供了对OBJECT_ATTRIBUTES结构初始化的宏InitializeObjectAttributes
VOID
InitializeObjectAttributes(
    OUT POBJECT_ATTRIBUTES InitializedAttributes, //返回的OBJECT_ATTRIBUTES结构
    IN PUNICODE_STRING ObjectName,                 //对象名称,用UNICODE_STRING描述,这里设置的是文件名。
    IN ULONG Attributes,                           //一般设为OBJ_CASE_INSENSITIVE,对大小敏感。
    IN HANDLE RootDirectory,                       //一般为NULL 空
    IN PSECURITY_DESCRIPTOR SecurityDescriptor     //一般为NULL 空
    );

打开文件
NTSTATUS
ZwOpenFile(
    OUT PHANDLE FileHandle,                  //返回打开的文件句柄。
    IN ACCESS_MASK DesiredAccess,            //打开的权限,一般设为GENERIC_ALL。
    IN POBJECT_ATTRIBUTES ObjectAttributes, //ObjectAttributes结构指针。
    OUT PIO_STATUS_BLOCK IoStatusBlock,      //指向一个结构体的指针。该结构体指明打开文件的状态。
    IN ULONG ShareAccess,                    //共享的权限。可以是FILE_SHARE_READ 或者FILE_SHARE_WRITE。
    IN ULONG OpenOptions                     //打开选项,一般设置为FILE_SYNCHRONOUS_IO_NONALERT。
    );

///
获取或修改文件属性
获取文件属性
NTSTATUS
ZwSetInformationFile(
    IN HANDLE FileHandle,                            //文件句柄
    OUT PIO_STATUS_BLOCK IoStatusBlock,              //返回设置的状态
    IN PVOID FileInformation,                        //依据FileInformationClass不同而不同。作为输入信息
    IN ULONG Length,                                 //FileInformation数据的长度
    IN FILE_INFORMATION_CLASS FileInformationClass   //描述修改属性的类型
    );
修改文件属性
NTSTATUS
ZwQueryInformationFile(
    IN HANDLE FileHandle,                          //文件句柄
    OUT PIO_STATUS_BLOCK IoStatusBlock,            //返回设置的状态
    OUT PVOID FileInformation,                     //依据FileInformationClass不同而不同。作为输出信息。
    IN ULONG Length,                               //FileInformation数据的长度
    IN FILE_INFORMATION_CLASS FileInformationClass //描述修改属性的类型
    );

当FileInformationClass是FileStandardInformation时输入和输出的数据是FILE_STANDARD_INFORMATION结构体,描述文件的基本信息。
typedef struct FILE_STANDARD_INFORMATION {
LARGE_INTEGER AllocationSize;      //为文件分配的大小(注意这不是文件大小,而是占用族所需要的大小)
LARGE_INTEGER EndOfFile;           //距离文件结尾还有多少字节
ULONG NumberOfLinks;               //有多少个连接文件
BOOLEAN DeletePending;             //是否准备删除
BOOLEAN Directory;                 //是否为目录
} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;

当FileInformationClass是FileBasicInformation时输入和输出的数据是FILE_BASIC_INFORMATION结构体,描述文件的基本信息。
typedef struct FILE_BASIC_INFORMATION {
LARGE_INTEGER CreationTime;      //文件创建时间
LARGE_INTEGER LastAccessTime;    //最后访问时间
LARGE_INTEGER LastWriteTime;     //最后写时间
LARGE_INTEGER ChangeTime;        //修改修改时间
ULONG FileAttributes;            //文件属性
} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;

当FileInformationClass是FileNameInformation时输入和输出的数据是FILE_NAME_INFORMATION结构体,描述文件的基本信息。
typedef struct _FILE_NAME_INFORMATION {
ULONG FileNameLength;    //文件名长度
WCHAR FileName[1];       //文件名
} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;

当FileInformationClass是FilePositionInformation时输入和输出的数据是FILE_POSITION_INFORMATION结构体,描述文件的基本信息。
typedef struct FILE_POSITION_INFORMATION {
LARGE_INTEGER CurrentByteOffset;                //代表当前文件指针位置
} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;

///
文件的写操作
NTSTATUS
ZwWriteFile(
    IN HANDLE FileHandle,                      //文件打开的句柄
    IN HANDLE Event OPTIONAL,                 //很少用到,一般设置为NULL
    IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,   //很少用到,一般设置为NULL
    IN PVOID ApcContext OPTIONAL,             //很少用到,一般设置为NULL
    OUT PIO_STATUS_BLOCK IoStatusBlock,        //记录写操作的状态。其中IoStatusBlock.Infomation 记录实际写了多少字节。
    IN PVOID Buffer,                           //从这个缓冲区开始往文件里写。
    IN ULONG Length,                           //准备写多少字节。
    IN PLARGE_INTEGER ByteOffset OPTIONAL,    //从文件的多少偏移地址开始写。
    IN PULONG Key OPTIONAL                    //很少用到,一般设置为NULL
    );
文件的读操作
NTSTATUS
ZwWriteFile(
    IN HANDLE FileHandle,                      //文件打开的句柄
    IN HANDLE Event OPTIONAL,                 //很少用到,一般设置为NULL
    IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,   //很少用到,一般设置为NULL
    IN PVOID ApcContext OPTIONAL,             //很少用到,一般设置为NULL
    OUT PIO_STATUS_BLOCK IoStatusBlock,        //记录写操作的状态。其中IoStatusBlock.Infomation 记录实际写了多少字节。
    IN PVOID Buffer,                           //从这个缓冲区开始往文件里读。/这个地方是读
    IN ULONG Length,                           //准备写多少字节。
    IN PLARGE_INTEGER ByteOffset OPTIONAL,    //从文件的多少偏移地址开始写。
    IN PULONG Key OPTIONAL                    //很少用到,一般设置为NULL
    );

///
内核模式下注册表操作
创建   关闭 注册表

获得打开的注册表句柄
NTSTATUS
ZwCreateKey(
    OUT PHANDLE KeyHandle,                    //获得的注册表句柄。
    IN ACCESS_MASK DesiredAccess,             //访问权限,一般设置为KEY_ALL_ACCESS
    IN POBJECT_ATTRIBUTES ObjectAttributes,   //OBJECT_ATTRIBUTES数据结构。
    IN ULONG TitleIndex,                      //很少用到,一般设置为0。
    IN PUNICODE_STRING Class OPTIONAL,       //很少用到,一般设置为NULL
    IN ULONG CreateOptions,                   //创建时的选项,一般设置为REG_OPTION_NON_VOLATILE
    OUT PULONG Disposition OPTIONAL          //返回是创建成功,还是打开成功。返回值是REG_CREATED_NEW_KEY或者是REG_OPENED_EXISTING_KEY
    );
打开注册表
NTSTATUS
ZwOpenKey(
    OUT PHANDLE KeyHandle,                    //返回被打开的句柄。
    IN ACCESS_MASK DesiredAccess,             //访问权限,一般设置为KEY_ALL_ACCESS
    IN POBJECT_ATTRIBUTES ObjectAttributes    //OBJECT_ATTRIBUTES数据结构,指示打开的状态。
    );

注册表键值的分类
REG_BINARY        //键值用二进制储存
REG_SZ            //键值用宽字符串,字符串以/0的结尾
REG_EXPAND_SZ     //键值用宽字符串,字符串以/0的结尾,该字符串是扩展的字符
REG_MULTI_SZ      //键值存储多个字符串,每个字符串以/0隔开
REG_DWORD         //键值用4字节整型存储
REG_QWORD         //键值用8字节存储

///
添加,修改注册表(使用同一个函数)
NTSTATUS
ZwSetValueKey(
    IN HANDLE KeyHandle,             //注册表句柄。
    IN PUNICODE_STRING ValueName,    //要新建或者修改的键名。
    IN ULONG TitleIndex OPTIONAL,   //很少用,一般设为0。
    IN ULONG Type,                   //键值类型
    IN PVOID Data,                   //数据
    IN ULONG DataSize                //记录键值数据的大小。
    );

查询注册表
NTSTATUS
ZwQueryValueKey(
    IN HANDLE KeyHandle,              //打开的注册表句柄。
    IN PUNICODE_STRING ValueName,     //要查询的键名。
    IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,    //根据KeyValueInformation的不同选择不同的查询类别。
    OUT PVOID KeyValueInformation,    //选择一种查询类别。选择KeyValueBasicInformation,KeyValueFullInformation或者KeyValuePartialInformation
    IN ULONG Length,                  //要查数据的长度。
    OUT PULONG ResultLength           //实际查询数据的长度。
    );

KeyValuePartialInformation对应查询的数据结构是KEY_VALUE_PARTIAL_INFORMATION的数据结构。
typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
ULONG TitleIndex;
ULONG Type;          //数据类型
ULONG DataLength;    //数据的长度
UCHAR Data[1];       //数据指针,这里是变长的数据
} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;

///
枚举子项
NTSTATUS
ZwQueryKey(
    IN HANDLE KeyHandle,       //注册表项的句柄。
    IN KEY_INFORMATION_CLASS KeyInformationClass,   //查询的类别,一般选择KeyFullInformation
    OUT PVOID KeyInformation, //查询的数据指针。如果KeyInformationClass是KeyFullInformation,则该指针指向一个KEY_FULL_INFORMATION的数据结构。
    IN ULONG Length,           //数据长度。
    OUT PULONG ResultLength    //返回的数据长度。
    );

NTSTATUS
ZwEnumerateKey(
    IN HANDLE KeyHandle,       //注册表项句柄。
    IN ULONG Index,            //很少用到,一般为0。
    IN KEY_INFORMATION_CLASS KeyInformationClass, //该子项的信息。
    OUT PVOID KeyInformation, //查询的数据指针。
    IN ULONG Length,           //子项信息的长度。
    OUT PULONG ResultLength    //返回子键信息的长度。
    );

///
删除子项
NTSTATUS
ZwDeleteKey(
    IN HANDLE KeyHandle    //打开的文件句柄。
    );

///
RtlXXX关于注册表的操作函数
RtlCreateRegistryKey       创建注册表
RtlCheckRegistryKey        查看某注册表项是否存在
RtlWriteRegistryValue      写注册表
RtlDeleteRegistryValue     删除注册表的子键

///

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值