Windows驱动开发技术详解 第六章的(Windows内核函数)自我理解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Windows驱动开发技术详解第六章的(Windows内核函数)自我理解
学习各种高级外挂制作技术,马上去百度搜索(魔鬼作坊),点击第一个站进入,快速成为做挂达人。
其实这章主要就是讲函数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字符串转化成大写
NTSTA TUS
RtlUpcaseUnicodeString(
IN OUT PUNICODE_STRING DestinationString OPTIONAL,//目的字符串。
IN PCUNICODE_STRING SourceString,//源字符串。
IN BOOLEAN AllocateDestinationString//是否为目的字符串分配内存。
);
///////////////////////////////////////////////////////////////////////////////
字符串与整型数字相互转换
UNICODE_STRING字符串转化成整数
NTSTA TUS
RtlUnicodeStringToInteger(
IN PUNICODE_STRING String,//需要转换的字符串。
IN ULONG Base OPTIONAL,//转换的数的进制(如2,8,10,16)。
OUT PULONG Value//需要转换的数字。
);
将整数转化成UNICODE_STRING字符串
NTSTA TUS
RtlIntegerToUnicodeString(
IN ULONG Value,//需要转换的数字。
IN ULONG Base OPTIONAL,//转换的数的进制(如2,8,10,16)。
IN OUT PUNICODE_STRING String//需要转换的字符串。
);
///////////////////////////////////////////////////////////////////////////////
内核模式下的文件操作
文件创建
NTSTA TUS
ZwCreateFile(
OUT PHANDLE FileHandle,//返回打开文件的句柄
IN ACCESS_MASK DesiredAccess,//对打开文件操作的描述,读,写或者其他。
一般指定GENERIC_READ或者GENERIC_WRITE。
IN POBJECT_ATTRIBUTES ObjectAttributes,//是OBJECT_ATTRIBUTES结构地址,该结构
包含要打开的文件名。
OUT PIO_STA TUS_BLOCK IoStatusBlock,//指向一个IO_STA TUS_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空
);
打开文件
NTSTA TUS
ZwOpenFile(
OUT PHANDLE FileHandle,//返回打开的文件句柄。
IN ACCESS_MASK DesiredAccess,//打开的权限,一般设为GENERIC_ALL。
IN POBJECT_ATTRIBUTES ObjectAttributes,//ObjectAttributes结构指针。
OUT PIO_STA TUS_BLOCK IoStatusBlock,//指向一个结构体的指针。
该结构体指明打开文件的状态。
IN ULONG ShareAccess,//共享的权限。
可以是FILE_SHARE_READ或者FILE_SHARE_WRITE。
IN ULONG OpenOptions//打开选项,一般设置为FILE_SYNCHRONOUS_IO_NONALERT。
);
///////////////////////////////////////////////////////////////////////////////
获取或修改文件属性
获取文件属性
NTSTA TUS
ZwSetInformationFile(
IN HANDLE FileHandle,//文件句柄
OUT PIO_STA TUS_BLOCK IoStatusBlock,//返回设置的状态
IN PVOID FileInformation,//依据FileInformationClass不同而不同。
作为输入信息
IN ULONG Length,//FileInformation数据的长度
IN FILE_INFORMATION_CLASS FileInformationClass//描述修改属性的类型
);
修改文件属性
NTSTA TUS
ZwQueryInformationFile(
IN HANDLE FileHandle,//文件句柄
OUT PIO_STA TUS_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;
///////////////////////////////////////////////////////////////////////////////
文件的写操作
NTSTA TUS
ZwWriteFile(
IN HANDLE FileHandle,//文件打开的句柄
IN HANDLE Event OPTIONAL,//很少用到,一般设置为NULL
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,//很少用到,一般设置为NULL
IN PVOID ApcContext OPTIONAL,//很少用到,一般设置为NULL
OUT PIO_STA TUS_BLOCK IoStatusBlock,//记录写操作的状态。
其中mation记录实际写了多少字节。
IN PVOID Buffer,//从这个缓冲区开始往文件里写。
IN ULONG Length,//准备写多少字节。
IN PLARGE_INTEGER ByteOffset OPTIONAL,//从文件的多少偏移地址开始写。
IN PULONG Key OPTIONAL//很少用到,一般设置为NULL
);
文件的读操作
NTSTA TUS
ZwWriteFile(
IN HANDLE FileHandle,//文件打开的句柄
IN HANDLE Event OPTIONAL,//很少用到,一般设置为NULL
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,//很少用到,一般设置为NULL
IN PVOID ApcContext OPTIONAL,//很少用到,一般设置为NULL
OUT PIO_STA TUS_BLOCK IoStatusBlock,//记录写操作的状态。
其中mation记录实际写了多少字节。
IN PVOID Buffer,//从这个缓冲区开始往文件里读。
/////这个地方是读
IN ULONG Length,//准备写多少字节。
IN PLARGE_INTEGER ByteOffset OPTIONAL,//从文件的多少偏移地址开始写。
IN PULONG Key OPTIONAL//很少用到,一般设置为NULL
);
///////////////////////////////////////////////////////////////////////////////
内核模式下注册表操作
创建关闭注册表
获得打开的注册表句柄
NTSTA TUS
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
);
打开注册表
NTSTA TUS
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字节存储
///////////////////////////////////////////////////////////////////////////////
添加,修改注册表(使用同一个函数)
NTSTA TUS
ZwSetValueKey(
IN HANDLE KeyHandle,//注册表句柄。
IN PUNICODE_STRING ValueName,//要新建或者修改的键名。
IN ULONG TitleIndex OPTIONAL,//很少用,一般设为0。
IN ULONG Type,//键值类型
IN PVOID Data,//数据
IN ULONG DataSize//记录键值数据的大小。
);
查询注册表
NTSTA TUS
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;
///////////////////////////////////////////////////////////////////////////////
枚举子项
NTSTA TUS
ZwQueryKey(
IN HANDLE KeyHandle,//注册表项的句柄。
IN KEY_INFORMATION_CLASS KeyInformationClass,//查询的类别,一般选择KeyFullInformation
OUT PVOID KeyInformation,//查询的数据指针。
如果KeyInformationClass是KeyFullInformation,则该指针指向一个KEY_FULL_INFORMATION的数据结构。
IN ULONG Length,//数据长度。
OUT PULONG ResultLength//返回的数据长度。
);
NTSTA TUS
ZwEnumerateKey(
IN HANDLE KeyHandle,//注册表项句柄。
IN ULONG Index,//很少用到,一般为0。
IN KEY_INFORMATION_CLASS KeyInformationClass,//该子项的信息。
OUT PVOID KeyInformation,//查询的数据指针。
IN ULONG Length,//子项信息的长度。
OUT PULONG ResultLength//返回子键信息的长度。
);
///////////////////////////////////////////////////////////////////////////////
删除子项
NTSTA TUS
ZwDeleteKey(
IN HANDLE KeyHandle//打开的文件句柄。
);
/////////////////////////////////////////////////////////////////////////////// RtlXXX关于注册表的操作函数RtlCreateRegistryKey创建注册表RtlCheckRegistryKey查看某注册表项是否存在RtlWriteRegistryValue写注册表RtlDeleteRegistryV alue删除注册表的子键
///////////////////////////////////////////////////////////////////////////////。