Windows内核安全编程基础知识(一)

PsGetCurrentProcessId等到当前进程的进程号。
 1.、基本数据类型
普通类型-------------------------------------------对应内核类型
unsigned long ------------------------------------ULONG
unsigned char ------------------------------------UCHAR
unsigned int --------------------------------------UINT
voiid ------------------------------------------------VOID
unsigned long * -----------------------------------PULONG
unsigned char * -----------------------------------PUCHAR
unsigned int ----------------------------------------PUINT
void * -----------------------------------------------PVOID
 
2、返回状态 一般返回类型为NTSTATUS,NT_SUCCESS(NTSTATUS status)这个宏判断是否成功。 常用的返回值:
STATUS_SUCCESS 成功
STATUS_INVALID_PARAMETER 错误的参数等 STATUS_INSUFFICIENT_RESOURCES 资源不足
STATUS_PENDING 请求未决
STATUS_BUFFER_OVERFIOW 缓冲区长度不够
STATUS_BUFFER_TOO_SMALL 缓冲区长度不够
 
3、字符串 字符串一般用结果来容纳,结构定义:
typedef struct_UNICODE_STRING{
        USHORT Length;
        USHORT MaximumLength;
        PWSTR Buffer;
}UNICODE_STRING *PUNICODE_STRING;
 
例子:UNICODE_STRING str=RTL_CONSTANT_STRING(L"AAAAAAAAAAA!"); DbgPrint("%wZ", &str); int用%d ,char用%c,UNICODE_STRING指针用%wZ。
 
4、常用函数类型: Io- Ex- Rtl- Ke- Zw- Nt- Ps- Ndis- Wdf- 系列函数______________________________________________________________
ExAllocatePool分配内存
ExFreePool内存释放 。
ExAcquireFastMutex获取一个快速互斥体,互斥体用于多线程环境下的同步。 ExReleaseFastMutex释放一个快速互斥体 。
ExRaiseStatus抛出一个异常,带有一个错误的status值,这个函数用于代码很深的地方直接报错。 ________________________________________________________________
Zw系列函数                      对应Nt系列函数             解释
ZwCreateFile                       NtCreateFile                  打开文件(也可以打开一个设备) ZwWnteFile                        NtWnteFile                    写入文件(也可以发送请求给设备) ZwReadFile                         NtReadFile                     读,同上
ZwQueryDirectoryFile       NtQueryDirectoryFIle  目录查询 ZwDeviceloControlFIle     NtDeviceloControFile  发送设备控制请求 ZwCreateKey                      NtCreateKey                 打开一个注册表键 ZwQueryValueKey            NtQueryValueKey         读取一个注册表中的值 _________________________________________________________________
RtlInitUnicodeString 始化一个字符串
RtlCopyUnicodeString 复制字符串
RtlAppendUnicodeToString 将一个字符串焊接到另一个字符串后
RtlStringCbPrintf 打印字符串
RtlCopyMemory 内存数据拷贝
RtlMoveMemory 内存数据移动
RtlZeroMemory 内存数据清零
RtlCompareMemory 比较内存
RtlGetVersion 获取当前Windows的版本 ___________________________________________________________________
IoCreateFile 打开文件,这个函数比较ZwCreateFile要更加底层 。
IoCreateDevice 生成一个设备对象 。
IoCallDriver 发送请求,实际上这个函数可能是IofCallDriver的一个别名,WindowsIO管理器调用这个函数把不同的IRP发送到不同的设备 。
IoCompleteRequest 完成请求。这实际上是通知IO管理器这个IRP已经完成了。 IoCopyCurrentIrpStackLocationToNext 跳过当前IRP的栈空间所向拷贝到下一个栈空间 。
IoSkipCurrentIrpStackLocationToNext 跳过当前IRP的栈空间 。
 
5、内核代码主要调用源的运行环境
DriverEntry,DriverUnIoad,单线程,这两个函数有系统进程的单一线程调用。不会出现多线程同时调用的情况。
各种分发函数,多线程,分发函数不会和DriverEntry并发,但可能和DriverUnIoad并发。
完成函数,多线程,完成函数随时可能被未知的线程调用。
各种NDIS回调函数,多线程,和完成函数相同
 
内核代码主要调用源的运行中断级
DirverEntry,DriverUnload Passive级
各种分发函数 Passive级
完成函数 Dispatch级
各种NDIS回调函数 Dispatch级
 
6、常用的宏 #define IN #define OUT 这样IN和OUT被定义成空了,用来作为函数的说明。
#pragma alloc_text(INIT , DriverEntry)
#pragma alloc_text(PAGE , NdisProtUnload)
#Pragme alloc_tex(PAGE , NdisProtOpen)
#pragma alloc_text(PAGE , NdisProtClose)
这个宏#pragma alloc_text指定某个函数的可执行代码在编译出来后在sys文件中的位置。内核模块编译出来之后是一个PE格式的sys文件,代码段(text段)中有不同的节(Section),常用的3种节: INIT节在初始化完毕之后就被释放,不在占用内存空间。 PAGE位于可以进行分页交换的内存空间,可以交换到硬盘上。 未指明默认位于PAGELK节,加载后位于不可分页交换的内存空间中。 PAGED_CODE()错误测试。                                                                                            
                                                                2012年6月10日
                                                                  qq:634938543

你可能感兴趣的:(驱动)