DDK 提供的字符操作 文件操作 注册表操作

其实这章主要就是讲函数   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     删除注册表的子键

///

 

转载自 yangyxd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值