文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Windows 内核编程初涉

Windows 内核编程初涉

时间:2011-01-06  来源:sld666666

1. 基本数据类型

    为了消除平台和编译器的差异,WDK定义了一套自己的数据类型。ULONG, UCHAR,UNIT VOID……

2. 函数返回值

    绝大部分内核API 都有一个返回值, 我在自己写的时候也需要:

NTSTATUS myFunc()
{
    NTSTATUS status;

    status = ZwCreateFile();
    if (!NT_SUCCESS(status))
    {
        return status;
    }

    return status;
}

3. 字符串

    WDK 中用UNICODE_STRING 表示字符串

typedef struct _UNICODE_STRING {
  USHORT  Length;
  USHORT  MaximumLength;
  PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

如:

UNICODE_STRING str = RTL_CONSTANT_STRING(L"first: hello, my salary");
DbgPrint("%wZ", &str);

其中 RTL_CONSTANT_STRING 宏是用来创建一个字符串的。

%wZ 是用来格式化输出字符串的, 和int 用%d, char用%c 同理。

4. 重要的数据结构

    windows内核采用的是面向对象的编程方式,但是使用的确实C语言。所以它的对象就是“伪对象”了。当然这个对象是指诸如一个驱动,一个设备,一个文件之类的东西了。每一个对象都用一个结构体表示。

4.1 驱动对象

    当编写一个应用程序时候,windows 直接从main 函数开始执行生成一个进程。但是内核模块并不生成一个进程,只是填写了一组回调函数让windows调用。而这个调用过程就需要驱动对象帮忙了。我看下驱动对象的定义:

typedef struct _DRIVER_OBJECT {

// 结构体的类型和大小
    CSHORT Type;
    CSHORT Size;

//设备对象, 这里实际上是一个设备对象链表的开头, 

   PDEVICE_OBJECT DeviceObject;


    ULONG Flags;

// 驱动的名字

    UNICODE_STRING DriverName;

    PUNICODE_STRING HardwareDatabase;

//快速分发函数

    PFAST_IO_DISPATCH FastIoDispatch;

    PDRIVER_INITIALIZE DriverInit;
    PDRIVER_STARTIO DriverStartIo;

//卸载函数
    PDRIVER_UNLOAD DriverUnload;

//普通分发函数
    PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];

} DRIVER_OBJECT;
typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;

4.2 设备对象

    windows 内核中,大部分消息都以请求(IRP)的方式传递,而设备对象(DEVICE_OBJECT)是唯一可以接收请求的实体。一个设备对象可以是一个硬盘或者一个“管道”。

typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT {
    CSHORT Type;//类型
    USHORT Size;//大小
    LONG ReferenceCount;//引用计数
    struct _DRIVER_OBJECT *DriverObject;//这个设备所属的驱动对象
    struct _DEVICE_OBJECT *NextDevice;//下一个设备对象,一个设备对象中有N个设备
    struct _DEVICE_OBJECT *AttachedDevice;
    struct _IRP *CurrentIrp;
    PIO_TIMER Timer;
    ULONG Flags;                                // See above:  DO_...
    ULONG Characteristics;                      // See ntioapi:  FILE_...
    __volatile PVPB Vpb;
    PVOID DeviceExtension;
    DEVICE_TYPE DeviceType;//设备类型
    CCHAR StackSize;//IRP栈的大小
    union {
        LIST_ENTRY ListEntry;
        WAIT_CONTEXT_BLOCK Wcb;
    } Queue;
    ULONG AlignmentRequirement;
    KDEVICE_QUEUE DeviceQueue;
    KDPC Dpc;

    //
    //  The following field is for exclusive use by the filesystem to keep
    //  track of the number of Fsp threads currently using the device
    //

    ULONG ActiveThreadCount;
    PSECURITY_DESCRIPTOR SecurityDescriptor;
    KEVENT DeviceLock;

    USHORT SectorSize;
    USHORT Spare1;

    struct _DEVOBJ_EXTENSION  *DeviceObjectExtension;
    PVOID  Reserved;

} DEVICE_OBJECT;

从上可以看出,一个驱动对象可以包含多个设备对象。

相关阅读 更多 +
排行榜 更多 +
XLM币最具爆发力的安全交易所币安binance下载

XLM币最具爆发力的安全交易所币安binance下载

金融理财 下载
XEM币最安全隐私链的全球交易所币安binance下载

XEM币最安全隐私链的全球交易所币安binance下载

金融理财 下载
WAVES币最新上线的优质交易所币安binance下载

WAVES币最新上线的优质交易所币安binance下载

金融理财 下载