青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

小默

Windows驅(qū)動(dòng)編程基礎(chǔ)教程-譚文-代碼整理

Windows驅(qū)動(dòng)編程基礎(chǔ)教程-譚文-代碼整理
基本上是教程上原代碼照抄,只給代碼做了個(gè)排列組合,改了一些作者的小筆誤
代碼全部測(cè)試通過,測(cè)試環(huán)境:WinDDK 7600.16385.0 chk x86 WXP
教程上有很詳細(xì)非常詳細(xì)的講解,偶就偷懶不寫注釋了
代碼中有些應(yīng)該考慮應(yīng)該實(shí)現(xiàn)的東西偶不會(huì),就省了。。。不會(huì)完善,能跑就行。。。

1 字符串使用
2 內(nèi)存的分配與釋放
3 LIST_ENTRY
4 LARGE_INTEGER
5 KSPIN_LOCK
6 文件操作
7 注冊(cè)表讀寫
8 時(shí)間與定時(shí)

未完待續(xù)。。。

makefile
#
# DO NOT EDIT THIS FILE
!!!  Edit .\sources. if you want to add a new source
# file to 
this component.  This file merely indirects to the real make file
# that 
is shared by all the driver components of the Windows NT DDK
#

!INCLUDE $(NTMAKEENV)\makefile.def

sources
TARGETNAME=study
TARGETPATH
=OBJ
TARGETTYPE
=DRIVER
SOURCES
=    study.c

1 字符串使用
/*
 *《Windows驅(qū)動(dòng)編程基礎(chǔ)教程-譚文》-字符串使用
 *測(cè)試環(huán)境:WinDDK 7600.16385.0 chk x86 WXP
 *小默 整理
*/

#include
<ntddk.h>
#include
<ntdef.h>

DRIVER_UNLOAD StudyUnload;

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
    PAGED_CODE();
    
    DriverObject
->DriverUnload = StudyUnload;
    
    
return STATUS_SUCCESS;
}

VOID StudyUnload(PDRIVER_OBJECT DriverObject)
{
    UNICODE_STRING str1;
    UNICODE_STRING dst;
    WCHAR dst_buf[
256];
    UNICODE_STRING src 
= RTL_CONSTANT_STRING(L"source string"); //Init a UNICODE_STRING
    NTSTATUS status;
    PAGED_CODE();

    DbgPrint(
"Study:Our driver is unloading\r\n");
    
//Init a UNICODE_STRING
    RtlInitUnicodeString(&str1,L"Init the string str1");
    KdPrint((
"Init a UNICODE_STRING:%wZ\r\n",&str1));

    
//把dst初始化成擁有緩沖區(qū)長度為256的UNICODE_STRING空串
    
//!!! copy 之前一定要先給dst分配空間!!!
    RtlInitEmptyUnicodeString(&dst,dst_buf,256*sizeof(WCHAR));
    
//copy a UNICODE_STRING
    RtlCopyUnicodeString(&dst,&src);
    KdPrint((
"Copy a UNICODE_STRING:%wZ\r\n",&dst));

    
//append a UNICODE_STRING
    status = RtlAppendUnicodeToString(&dst,L"|append string.");
    KdPrint((
"Append a UNICODE_STRING:%wZ\r\n",&dst));

    
return;
}

2 內(nèi)存的分配與釋放
/*
 *《Windows驅(qū)動(dòng)編程基礎(chǔ)教程-譚文》-內(nèi)存的分配與釋放
 *測(cè)試環(huán)境:WinDDK 7600.16385.0 chk x86 WXP
 *小默 整理
*/

#include
<ntddk.h>
#include
<ntdef.h>

//定義一個(gè)內(nèi)存分配標(biāo)記
#define MEM_TAG "CG"

DRIVER_UNLOAD StudyUnload;

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
    PAGED_CODE();
    
    DriverObject
->DriverUnload = StudyUnload;
    
    
return STATUS_SUCCESS;
}

VOID StudyUnload(PDRIVER_OBJECT DriverObject)
{
    UNICODE_STRING dst 
= {0};
    UNICODE_STRING src 
= RTL_CONSTANT_STRING(L"source string");
    NTSTATUS status;

    PAGED_CODE();

    
//根據(jù)src的長度,分配空間給dst
    dst.Buffer = (PWCHAR)ExAllocatePoolWithTag(NonPagedPool, //PoolTape
        src.Length, //NumberOfBytes 
        MEM_TAG);    //Tag
    if(dst.Buffer == NULL){
        status 
= STATUS_INSUFFICIENT_RESOURCES;
        KdPrint((
"FAIL with ExAllocatePoolWithTag"));
        
return;
    }
    dst.Length 
= dst.MaximumLength = src.Length;
    RtlCopyUnicodeString(
&dst,&src); //return void
    KdPrint(("Copy a UNICODE_STRING:%wZ\r\n",&dst));

    ExFreePool(dst.Buffer);
    dst.Buffer 
= NULL;
    dst.Length 
= dst.MaximumLength = 0;

    
return;
}


3 LIST_ENTRY
/*
 *《Windows驅(qū)動(dòng)編程基礎(chǔ)教程-譚文》- LIST_ENTRY
 *測(cè)試環(huán)境:WinDDK 7600.16385.0 chk x86 WXP
 *小默 整理
*/

#include
<ntddk.h>
#include
<ntdef.h>

#define MEM_TAG "CG"

DRIVER_UNLOAD StudyUnload;

//our list head
LIST_ENTRY my_list_head;

//our list node
typedef struct {
    LIST_ENTRY list_entry; 
//simple to put it at the head of the struct
    PFILE_OBJECT file_object;
    UNICODE_STRING file_name;
    
int file_length;
}MY_FILE_INFOR,
*PMY_FILE_INFOR;

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
    PAGED_CODE();

    
//Init our list head
    InitializeListHead(&my_list_head);
    
    DriverObject
->DriverUnload = StudyUnload;
    
    
return STATUS_SUCCESS;
}


//Append a node to list, note that file_name is allocated outside
NTSTATUS StudyAppendNode(
    PFILE_OBJECT file_object,
    UNICODE_STRING file_name,
    
int file_length)
{
    PMY_FILE_INFOR my_file_infor 
= (PMY_FILE_INFOR)ExAllocatePoolWithTag(PagedPool,sizeof(MY_FILE_INFOR),MEM_TAG);
    
if(my_file_infor == NULL){
        
return STATUS_INSUFFICIENT_RESOURCES;
        }

    my_file_infor
->file_object = file_object;
    my_file_infor
->file_name = file_name;
    my_file_infor
->file_length = file_length;

    InsertHeadList(
&my_list_head,    //PLIST_ENTRY  ListHead,
        (PLIST_ENTRY)my_file_infor);    //PLIST_ENTRY  Entry ==my_file_info->list_entry
                                    
//we put the LIST_ENTRY at the head of the struct,so my_file_info==my_file_info->list_entry here

    
return STATUS_SUCCESS;
}


VOID StudyUnload(PDRIVER_OBJECT DriverObject)
{
    PFILE_OBJECT file_object 
= NULL;
    UNICODE_STRING file_name 
= RTL_CONSTANT_STRING(L"c:\\study.txt");
    UNICODE_STRING file_name2 
= RTL_CONSTANT_STRING(L"c:\\study2.txt");
    
int file_length = 0x123;
    PLIST_ENTRY p;

    StudyAppendNode(file_object,file_name,file_length);
    StudyAppendNode(file_object,file_name2,file_length);

    
for(p = my_list_head.Flink; p != &my_list_head.Flink; p = p->Flink){ 
        PMY_FILE_INFOR elem 
= CONTAINING_RECORD(p,    //Address
            MY_FILE_INFOR,    //Type
            list_entry);    //Field
        KdPrint(("node of MY_FILE_INFOR list, name: %wZ\n",&elem->file_name));
        }
    
    
return;
}


4 LARGE_INTEGER
/*
 *《Windows驅(qū)動(dòng)編程基礎(chǔ)教程-譚文》- LARGE_INTEGER
 *測(cè)試環(huán)境:WinDDK 7600.16385.0 chk x86 WXP
 *小默 整理
*/

#include
<ntddk.h>
#include
<ntdef.h>

#define MEM_TAG "CG"

DRIVER_UNLOAD StudyUnload;

//our list head
LIST_ENTRY my_list_head;

//our list node
typedef struct {
    LIST_ENTRY list_entry; 
//simple to put it at the head of the struct
    PFILE_OBJECT file_object;
    UNICODE_STRING file_name;
    LARGE_INTEGER file_length;
}MY_FILE_INFOR,
*PMY_FILE_INFOR;

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
    PAGED_CODE();

    
//Init our list head
    InitializeListHead(&my_list_head);
    
    DriverObject
->DriverUnload = StudyUnload;
    
    
return STATUS_SUCCESS;
}


//Append a node to list, note that file_name is allocated outside
NTSTATUS StudyAppendNode(
    PFILE_OBJECT file_object,
    UNICODE_STRING file_name,
    LARGE_INTEGER file_length)
{
    PMY_FILE_INFOR my_file_infor 
= (PMY_FILE_INFOR)ExAllocatePoolWithTag(PagedPool,sizeof(MY_FILE_INFOR),MEM_TAG);
    
if(my_file_infor == NULL){
        
return STATUS_INSUFFICIENT_RESOURCES;
        }

    my_file_infor
->file_object = file_object;
    my_file_infor
->file_name = file_name;
    my_file_infor
->file_length = file_length;

    InsertHeadList(
&my_list_head,    //PLIST_ENTRY  ListHead,
        (PLIST_ENTRY)my_file_infor);    //PLIST_ENTRY  Entry ==my_file_info->list_entry
                                    
//we put the LIST_ENTRY at the head of the struct,so my_file_info==my_file_info->list_entry here

    
return STATUS_SUCCESS;
}


VOID StudyUnload(PDRIVER_OBJECT DriverObject)
{
    PFILE_OBJECT file_object 
= NULL;
    UNICODE_STRING file_name 
= RTL_CONSTANT_STRING(L"c:\\study.txt");
    UNICODE_STRING file_name2 
= RTL_CONSTANT_STRING(L"c:\\study2.txt");
    LARGE_INTEGER file_length1,file_length2;
    PLIST_ENTRY p;

    file_length1.QuadPart 
= 100;
    file_length2.QuadPart 
= file_length1.QuadPart * 100;

    StudyAppendNode(file_object,file_name,file_length1);
    StudyAppendNode(file_object,file_name2,file_length2);

    
for(p = my_list_head.Flink; p != &my_list_head.Flink; p = p->Flink){ 
        PMY_FILE_INFOR elem 
= CONTAINING_RECORD(p,    //Address
            MY_FILE_INFOR,    //Type
            list_entry);    //Field
        KdPrint(("node of MY_FILE_INFOR list, name: %wZ, length:%d\n",&elem->file_name,elem->file_length.QuadPart));
        
if(elem->file_length.QuadPart > 1000){
            KdPrint((
"file length > 1000,LowPart = %d, HighPart = %d\n",elem->file_length.LowPart,elem->file_length.HighPart));
            }
        }
    
    
return;
}


5 KSPIN_LOCK
/*
 *《Windows驅(qū)動(dòng)編程基礎(chǔ)教程-譚文》- kSPIN_LOCK
 *測(cè)試環(huán)境:WinDDK 7600.16385.0 chk x86 WXP
 *小默 整理
*/

#include
<ntddk.h>
#include
<ntdef.h>

#define MEM_TAG "CG"

DRIVER_UNLOAD StudyUnload;

//our list head
LIST_ENTRY my_list_head;

//our list node
typedef struct {
    LIST_ENTRY list_entry; 
//simple to put it at the head of the struct
    PFILE_OBJECT file_object;
    UNICODE_STRING file_name;
    LARGE_INTEGER file_length;
}MY_FILE_INFOR,
*PMY_FILE_INFOR;

//our spin lock, CANNOT be local
KSPIN_LOCK my_spin_lock;

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
    PAGED_CODE();

    
//Init our list head
    InitializeListHead(&my_list_head);
    
//Init our spin lock
    KeInitializeSpinLock(&my_spin_lock);
    
    DriverObject
->DriverUnload = StudyUnload;
    
    
return STATUS_SUCCESS;
}


//Append a node to list, note that file_name is allocated outside
NTSTATUS StudyAppendNode(
    PFILE_OBJECT file_object,
    UNICODE_STRING file_name,
    LARGE_INTEGER file_length)
{
    PMY_FILE_INFOR my_file_infor 
= (PMY_FILE_INFOR)ExAllocatePoolWithTag(PagedPool,sizeof(MY_FILE_INFOR),MEM_TAG);
    
if(my_file_infor == NULL){
        
return STATUS_INSUFFICIENT_RESOURCES;
        }

    my_file_infor
->file_object = file_object;
    my_file_infor
->file_name = file_name;
    my_file_infor
->file_length = file_length;

    ExInterlockedInsertHeadList(
&my_list_head,    //PLIST_ENTRY  ListHead,
        (PLIST_ENTRY)my_file_infor,
        
&my_spin_lock);    
                                    

    
return STATUS_SUCCESS;
}


VOID StudyUnload(PDRIVER_OBJECT DriverObject)
{
    PFILE_OBJECT file_object 
= NULL;
    UNICODE_STRING file_name 
= RTL_CONSTANT_STRING(L"c:\\study.txt");
    UNICODE_STRING file_name2 
= RTL_CONSTANT_STRING(L"c:\\study2.txt");
    LARGE_INTEGER file_length1,file_length2;
    PLIST_ENTRY p;

    file_length1.QuadPart 
= 100;
    file_length2.QuadPart 
= file_length1.QuadPart * 100;

    StudyAppendNode(file_object,file_name,file_length1);
    StudyAppendNode(file_object,file_name2,file_length2);

    
for(p = my_list_head.Flink; p != &my_list_head.Flink; p = p->Flink){ 
        PMY_FILE_INFOR elem 
= CONTAINING_RECORD(p,    //Address
            MY_FILE_INFOR,    //Type
            list_entry);    //Field
        KdPrint(("node of MY_FILE_INFOR list, name: %wZ, length:%d\n",&elem->file_name,elem->file_length.QuadPart));
        
if(elem->file_length.QuadPart > 1000){
            KdPrint((
"file length > 1000,LowPart = %d, HighPart = %d\n",elem->file_length.LowPart,elem->file_length.HighPart));
            }
        }
    
    
return;
}


6 文件操作
/*
 *《Windows驅(qū)動(dòng)編程基礎(chǔ)教程-譚文》- 文件操作
 *測(cè)試環(huán)境:WinDDK 7600.16385.0 chk x86 WXP
 *小默 整理
*/

/*
 *需要在C盤根目錄下放一個(gè)study.txt文件,寫入任意內(nèi)容,當(dāng)作拷貝的原文件
*/

#include
<ntddk.h>
#include
<ntdef.h>

#define MEM_TAG "CG"

DRIVER_UNLOAD StudyUnload;

VOID StudyBakFileThread(VOID);


NTSTATUS
DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
    PAGED_CODE();
    
    DriverObject
->DriverUnload = StudyUnload;

    StudyBakFileThread();
    
    
return STATUS_SUCCESS;
}




VOID
StudyBakFileThread()
{
    UNICODE_STRING src_name 
= RTL_CONSTANT_STRING(L"\\DosDevices\\c:\\study.txt"); 
    UNICODE_STRING dst_name 
= RTL_CONSTANT_STRING(L"\\DosDevices\\c:\\study.bak"); 
    HANDLE src 
= NULL, dst = NULL; //the handles of the files to be copyed and copyed to 
    PVOID buffer = NULL;
    OBJECT_ATTRIBUTES object_attributes_src,object_attributes_dst;
    LARGE_INTEGER offset 
= {0};
    IO_STATUS_BLOCK io_status 
= {0};
    NTSTATUS status;
    
int length;

    
do{
        InitializeObjectAttributes(
        
&object_attributes_src,
        
&src_name,
        OBJ_CASE_INSENSITIVE 
| OBJ_KERNEL_HANDLE,
        NULL,
        NULL);

        status 
= ZwCreateFile(
        
&src,
        SYNCHRONIZE 
| FILE_READ_DATA | FILE_WRITE_DATA,
        
&object_attributes_src,
        
&io_status,
        NULL,
        FILE_ATTRIBUTE_NORMAL,
        FILE_SHARE_READ,
        FILE_OPEN_IF,
        FILE_NON_DIRECTORY_FILE 
| FILE_RANDOM_ACCESS | FILE_SYNCHRONOUS_IO_NONALERT,
        NULL,
        
0);

        InitializeObjectAttributes(
        
&object_attributes_dst,
        
&dst_name,
        OBJ_CASE_INSENSITIVE 
| OBJ_KERNEL_HANDLE,
        NULL,
        NULL);

        status 
= ZwCreateFile(
        
&dst,
        SYNCHRONIZE 
| FILE_READ_DATA | FILE_WRITE_DATA,
        
&object_attributes_dst,
        
&io_status,
        NULL,
        FILE_ATTRIBUTE_NORMAL,
        
0,
        FILE_OPEN_IF,
        FILE_SYNCHRONOUS_IO_NONALERT,
        NULL,
        
0);

        buffer 
= ExAllocatePoolWithTag(PagedPool,4096,MEM_TAG);
        
if(NULL == buffer){
            KdPrint((
"FAIL ExAllocatePoolWithTag"));
            
return;
            }

        
while(1){
            length 
= 4*1024;

            status 
= ZwReadFile(
                src,NULL,NULL,NULL,
                
&io_status,
                buffer,
                length,
                
&offset,
                NULL);
            
if(!NT_SUCCESS(status)){
                
if(STATUS_END_OF_FILE)
                    status 
= STATUS_SUCCESS;
                
break;
                }

            length 
= io_status.Information;

            status 
= ZwWriteFile(
                dst,NULL,NULL,NULL,
                
&io_status,
                buffer,
                length,
                
&offset,
                NULL);
            
if(!NT_SUCCESS(status))
                
break;

            offset.QuadPart 
+= length;
            }
        
        }
while(0);

    
if(NULL != src)
        ZwClose(src);
    
if(NULL != dst)
        ZwClose(dst);
    
if(NULL != buffer)
        ExFreePool(buffer);

}


VOID
StudyUnload(PDRIVER_OBJECT DriverObject)
{

    
return;
}


7 注冊(cè)表讀寫
/*
 *《Windows驅(qū)動(dòng)編程基礎(chǔ)教程-譚文》- 注冊(cè)表讀寫
 *測(cè)試環(huán)境:WinDDK 7600.16385.0 chk x86 WXP
 *小默 整理
*/

#include
<ntddk.h>
#include
<ntdef.h>

#define MEM_TAG "CG"

DRIVER_UNLOAD StudyUnload;

VOID StudyRegistry(VOID);


NTSTATUS
DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
    PAGED_CODE();
    
    DriverObject
->DriverUnload = StudyUnload;

    StudyRegistry();
    
    
return STATUS_SUCCESS;
}


VOID
StudyRegistry()
{
    HANDLE my_key 
= NULL;
    NTSTATUS status;
    
//read
    UNICODE_STRING my_key_path = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
    UNICODE_STRING my_key_name 
= RTL_CONSTANT_STRING(L"SystemRoot");
    UNICODE_STRING my_key_value;
    
//write
    UNICODE_STRING wr_name = RTL_CONSTANT_STRING(L"Test");
    PCHAR wr_value 
= {L"Test Value"};
    OBJECT_ATTRIBUTES my_obj_attr 
= {0};
    KEY_VALUE_PARTIAL_INFORMATION key_infor; 
//tmp key_infor to test the length
    PKEY_VALUE_PARTIAL_INFORMATION ac_key_infor; //actual key infor we use.buffer in dui
    ULONG ac_length;

    InitializeObjectAttributes(
        
&my_obj_attr,
        
&my_key_path,
        OBJ_CASE_INSENSITIVE,
        NULL,
        NULL);

    status 
= ZwOpenKey(
        
&my_key,
        KEY_READ,
        
&my_obj_attr);
    
if(!NT_SUCCESS(status)){
        KdPrint((
"ERROR - ZwOpenKey"));
        
return;
        }

    
//get the real length of the key
    status = ZwQueryValueKey(
        my_key,    
//HANDLE  KeyHandle,
        &my_key_name,    
        KeyValuePartialInformation,
        
&key_infor,
        
sizeof(KEY_VALUE_PARTIAL_INFORMATION),
        
&ac_length);
    
if(!NT_SUCCESS(status) &&
        STATUS_BUFFER_OVERFLOW 
!= status &&
        STATUS_BUFFER_TOO_SMALL 
!= status){
        KdPrint((
"ERROR - ZwQueryValueKey"));
        
return;
        }

    
//Allocate enough space
    ac_key_infor = (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePoolWithTag(NonPagedPool,ac_length,MEM_TAG);
    
if(ac_key_infor == NULL){
        KdPrint((
"ERROR - Allocate space for ac_key_infor"));
        
return;
        }

    status 
= ZwQueryValueKey(
        my_key,    
//HANDLE  KeyHandle,
        &my_key_name,    
        KeyValuePartialInformation,
        ac_key_infor,
        ac_length,
        
&ac_length);
    
if(NT_SUCCESS(status)){
        KdPrint((
"SystemRoot is:%ws\n",ac_key_infor->Data));
        }

    status 
= ZwSetValueKey(
        my_key,        
//IN HANDLE  KeyHandle,
        &wr_name,    //IN PUNICODE_STRING  ValueName
        0,            //IN ULONG  TitleIndex  OPTIONAL,
        REG_SZ,        //IN ULONG  Type,
        wr_value,    //IN PVOID  Data,
        (wcslen(wr_value)+1)*sizeof(WCHAR));    //IN ULONG  DataSize
    if(!NT_SUCCESS(status)){
        KdPrint((
"ERROR! - ZwSetValueKey"));
        
return;
        }


}

VOID
StudyUnload(PDRIVER_OBJECT DriverObject)
{

    
return;
}


8 時(shí)間與定時(shí)
/*
 *《Windows驅(qū)動(dòng)編程基礎(chǔ)教程-譚文》- 時(shí)間與定時(shí)
 *測(cè)試環(huán)境:WinDDK 7600.16385.0 chk x86 WXP
 *小默 整理
*/

#include
<ntddk.h>
#include
<ntdef.h>
#include
<ntstrsafe.h>

#define MEM_TAG "CG"

DRIVER_UNLOAD StudyUnload;

typedef 
struct MY_TIMER_
{
    KDPC dpc;
    KTIMER timer;
    PKDEFERRED_ROUTINE func;
    
int private_context;
}MY_TIMER,
*PMY_TIMER;

VOID StudyGetTickCount(VOID);
VOID StudyCurTimeStr();
VOID StudySetTimer();
VOID StudyDcpRoutine(
    PRKDPC dpc,
    PVOID DeferredContext,
    PVOID SystemArgument1,
    PVOID SystemArgument2);


NTSTATUS
DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
    PAGED_CODE();
    
    DriverObject
->DriverUnload = StudyUnload;

    StudyGetTickCount();
    StudyCurTimeStr();
    StudySetTimer();
    
    
return STATUS_SUCCESS;
}

VOID
StudyGetTickCount()
{
    LARGE_INTEGER tick_count;
    ULONG time_inc 
= KeQueryTimeIncrement(); //the number of 100-nanosecond units between two interval clock interrupts
    KeQueryTickCount(&tick_count); //count of the interval clock interrupts that have occurred since the system was booted
    tick_count.QuadPart *= time_inc;
    tick_count.QuadPart 
/= 10000;
    KdPrint((
"the system has been booted %d ms\n",tick_count.LowPart));

    
return;
}

VOID
StudyCurTimeStr()
{
    LARGE_INTEGER snow,now;
    TIME_FIELDS now_fields;
    WCHAR time_str[
32= { 0 };

    KeQuerySystemTime(
&snow);    //get the current system time of the GMT time zone
    ExSystemTimeToLocalTime(&snow,&now); //adjust this value for the local time zone
    RtlTimeToTimeFields(&now,&now_fields);

    RtlStringCchPrintfW(
        time_str,
        
32*2,
        L
"%4d-%2d-%2d %2d-%2d-%2d",
        now_fields.Year,now_fields.Month,now_fields.Day,
        now_fields.Hour,now_fields.Minute,now_fields.Second);

    KdPrint((
"The current time: %ws",&time_str));
}

VOID 
StudySetTimer()
{
    PMY_TIMER my_timer 
= (PMY_TIMER)ExAllocatePoolWithTag(PagedPool,sizeof(MY_TIMER),MEM_TAG);
    LARGE_INTEGER due;
    
int msec = 1000;

    due.QuadPart 
= -10000*msec;

    my_timer
->private_context = 5;
    my_timer
->func = StudyDcpRoutine;
    
    KeInitializeDpc(
        
&my_timer->dpc,        //PRKDPC  Dpc
        StudyDcpRoutine,    //PKDEFERRED_ROUTINE  DeferredRoutine,
        my_timer);    //PVOID  DeferredContext

    KeInitializeTimer(
&my_timer->timer); //Init Timer

    KdPrint((
"before set timer"));
    
    KeSetTimer(
&my_timer->timer,due,&my_timer->dpc);
}


VOID
StudyDcpRoutine(
    PRKDPC dpc,
    PVOID DeferredContext,
    PVOID SystemArgument1,
    PVOID SystemArgument2)
{
    PMY_TIMER my_timer 
= (PMY_TIMER)DeferredContext;

    KdPrint((
"in dcp routine,context %d",my_timer->private_context));
}




VOID
StudyUnload(PDRIVER_OBJECT DriverObject)
{

    
return;
}

posted on 2010-02-24 22:20 小默 閱讀(2550) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Windows

導(dǎo)航

統(tǒng)計(jì)

留言簿(13)

隨筆分類(287)

隨筆檔案(289)

漏洞

搜索

積分與排名

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩国产成人在线免费 | 欧美mv日韩mv国产网站| 亚洲茄子视频| 久久精品动漫| 亚洲综合精品自拍| 欧美精品成人在线| 欧美高清一区| 亚洲欧洲精品一区二区三区不卡 | 久久综合一区二区| 久久先锋资源| 亚洲成人在线视频播放| 欧美大片免费观看在线观看网站推荐| 欧美一级久久久| 国产欧美精品日韩| 久久亚洲精品一区二区| 亚洲国产精品一区二区www| 国产午夜精品全部视频在线播放 | 国产精品入口66mio| 国自产拍偷拍福利精品免费一| 亚洲精品免费电影| 欧美一区二区视频免费观看| 国产精品av免费在线观看| 亚洲一区二区三区午夜| 欧美3dxxxxhd| 亚洲香蕉视频| 亚洲国产电影| 国产精品大片wwwwww| 玖玖玖国产精品| 夜夜爽www精品| 亚洲黄色在线观看| 欧美一级视频免费在线观看| 亚洲精品在线二区| 国产一区二三区| 欧美四级在线观看| 欧美成人资源| 噜噜噜噜噜久久久久久91| 午夜视频一区二区| 亚洲一区尤物| 亚洲私人影院| 亚洲综合成人在线| 欧美一站二站| 久久久亚洲精品一区二区三区| 在线视频免费在线观看一区二区| 免费在线亚洲欧美| 亚洲国产一区二区在线| 久久久噜久噜久久综合| 久久男人资源视频| 蜜臀久久99精品久久久久久9| 久久成人18免费网站| 欧美在线视频全部完| 欧美午夜在线观看| 国产精品久久久久久久久借妻 | 一本综合久久| 中文久久精品| 久久国产精品网站| 久久夜色精品国产噜噜av| 欧美成人dvd在线视频| 欧美大片在线看免费观看| 亚洲大胆av| 亚洲欧美成aⅴ人在线观看| 久久久久国产免费免费| 欧美精品久久久久久久免费观看| 欧美视频中文字幕| 亚洲激情第一页| 久久精品女人天堂| 一本综合久久| 免费久久精品视频| 国产在线成人| 亚洲欧美文学| 一区二区三区成人| 欧美久久影院| 亚洲欧洲一级| 美女主播一区| 久久久噜噜噜| 精品不卡视频| 久久尤物电影视频在线观看| 亚洲美女黄网| 欧美日韩一区二区三区在线看 | 国产一区二区精品| 亚洲一区二区三区四区视频| 亚洲高清在线观看一区| 在线综合视频| 国产日本亚洲高清| 久久精品日韩欧美| 美女视频黄 久久| 尤物九九久久国产精品的特点| 欧美一区二区三区免费视频| 亚洲欧美精品一区| 国产一二精品视频| 美日韩精品免费| 欧美日韩爆操| 亚洲欧美日韩综合| 久久久91精品| 亚洲剧情一区二区| 亚洲一区二区黄色| 亚洲大胆人体视频| 一本色道久久综合亚洲精品小说 | 欧美二区在线播放| 亚洲视频国产视频| 久久久久久久网| 99热免费精品在线观看| 亚洲综合视频在线| 亚洲无线一线二线三线区别av| 欧美精品免费观看二区| 久久精品综合一区| 国产精品你懂的在线| 亚洲在线一区二区| 女人色偷偷aa久久天堂| 亚洲看片网站| 欧美福利一区二区| 在线观看一区二区精品视频| 亚洲一区精彩视频| 午夜精品久久久久久久男人的天堂| 欧美日韩国产成人在线| 欧美中文字幕视频| 亚洲第一精品夜夜躁人人爽| 在线欧美日韩| 性做久久久久久| 久久精品视频导航| 欧美大胆a视频| 欧美一级片一区| 99热在线精品观看| 亚洲国产精品小视频| 国产精品视频成人| 欧美麻豆久久久久久中文| 久久福利影视| 欧美一级二区| 欧美一区二区三区四区夜夜大片| 亚洲精品自在久久| 日韩视频在线你懂得| 亚洲精品久久久久中文字幕欢迎你| 久久在线播放| 麻豆av福利av久久av| 久久九九精品| 久久久国产一区二区| 久久久午夜精品| 久久一区二区三区四区五区| 美女视频黄免费的久久| 欧美成人一区二区三区在线观看| 国产午夜精品久久久久久免费视 | 欧美国产欧美亚洲国产日韩mv天天看完整 | 国产精品99久久久久久人| 久久久久久亚洲精品杨幂换脸 | 99热精品在线观看| 亚洲黄色免费电影| 欧美日韩视频一区二区| 亚洲国产精品久久久久秋霞不卡| 欧美国产日韩一区| 亚洲国产精品久久91精品| 亚洲黄色性网站| 亚洲性图久久| 在线观看视频亚洲| 9l视频自拍蝌蚪9l视频成人| 欧美视频在线观看一区二区| 久久久久国产精品午夜一区| 欧美性做爰毛片| 亚洲视频1区| 欧美在线日韩| 国产伦精品免费视频| 欧美成人第一页| 国产色婷婷国产综合在线理论片a| 美女主播一区| 亚洲免费高清| 午夜欧美大片免费观看| 亚洲二区在线| 一区二区国产在线观看| 国模套图日韩精品一区二区| 91久久久亚洲精品| 欧美视频二区| 美脚丝袜一区二区三区在线观看 | 免费观看日韩| 亚洲综合日韩中文字幕v在线| 欧美在线看片| 中文亚洲欧美| 欧美日韩一区二区在线| 亚洲私人影院| 久久激情久久| 亚洲在线不卡| 欧美精品久久久久a| 久久狠狠婷婷| 欧美日韩一区二区在线视频| 嫩模写真一区二区三区三州| 国产精品欧美在线| 亚洲美女精品成人在线视频| 亚洲国产视频一区| 久久福利一区| 欧美专区日韩专区| 欧美色视频日本高清在线观看| 欧美不卡一区| 国内外成人免费视频| 正在播放欧美视频| 一本久道久久综合中文字幕| 美女视频黄 久久| 欧美成人综合| 亚洲欧洲一区二区在线观看| 欧美在线一区二区三区| 久久国产精品网站| 国产午夜精品久久久久久久| 午夜久久影院| 久久久一区二区|