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

小默

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>
            农夫在线精品视频免费观看| 亚洲第一天堂av| 国产精品青草久久| 久久久久国产一区二区三区| 午夜精品久久久久久久蜜桃app | 日韩视频专区| 亚洲国产精品久久久久婷婷884| 久久这里只有| 麻豆久久精品| 国产精品一级| 久久激情中文| 噜噜噜91成人网| 欧美色视频一区| 久久伊伊香蕉| 亚洲深夜福利视频| 一区二区三区高清视频在线观看| 欧美亚洲网站| 国产精品免费福利| 国产精品入口麻豆原神| 开心色5月久久精品| 国产精品视频免费一区| 久久精品国产欧美亚洲人人爽| 亚洲裸体俱乐部裸体舞表演av| 亚洲欧美成人综合| 国产精品劲爆视频| 亚洲欧美日韩另类| 亚洲一区二区3| 欧美久久视频| 欧美mv日韩mv国产网站app| 国产免费成人| 午夜精品福利视频| 亚洲免费伊人电影在线观看av| 91久久久久| 免播放器亚洲| 欧美一区二区精品久久911| 国产精品毛片高清在线完整版| 欧美一级视频一区二区| 亚洲黄色天堂| 久久久亚洲欧洲日产国码αv | 亚洲美女中文字幕| 久久一区二区三区av| 99re66热这里只有精品3直播| 亚洲精品一区在线| 黄色成人av网站| 国产精品卡一卡二| 亚洲福利视频在线| 日韩视频在线播放| av成人天堂| 亚洲经典三级| 欧美高清成人| 好男人免费精品视频| 国产精品视频yy9099| 亚洲国产精品激情在线观看| 亚洲一区二区三区激情| 亚洲私人影吧| 久久精品国产99国产精品澳门| 欧美性理论片在线观看片免费| 国产欧美日韩亚州综合| 国产精品爱久久久久久久| 亚洲欧美国产高清va在线播| 久久不射电影网| 一区二区欧美亚洲| 性欧美大战久久久久久久久| 欧美午夜精品久久久久久人妖| 亚洲欧洲另类国产综合| 亚洲一区二区3| 欧美一区二区三区视频在线 | 国产精品视频网站| 欧美激情欧美狂野欧美精品| 国产精品中文字幕欧美| 国产精品视频久久一区| 亚洲精品乱码视频 | 久久久之久亚州精品露出| 亚洲影音一区| 亚洲国产美女| 亚洲人成77777在线观看网| 亚洲免费观看| 欧美国产在线电影| 欧美三级网址| 国产婷婷精品| 亚洲自拍偷拍网址| 99热免费精品在线观看| 欧美日本国产视频| 欧美一区二区播放| 亚洲精品日韩激情在线电影| 中文网丁香综合网| 欧美精品综合| 久久人91精品久久久久久不卡 | 欧美激情精品久久久久久免费印度| 欧美在线观看视频在线 | 亚洲综合电影| 亚洲国产精品福利| 亚洲三级影片| 国产主播一区二区三区| 久久久久久久久久久久久女国产乱| 欧美韩日一区二区三区| 欧美va亚洲va香蕉在线| 91久久精品国产| 亚洲午夜av| 国产专区综合网| 欧美激情精品久久久久久蜜臀 | 亚洲美女电影在线| 欧美二区不卡| 男人的天堂成人在线| 在线观看91久久久久久| 久久爱www久久做| 在线观看av不卡| 欧美韩日一区| 你懂的视频一区二区| 亚洲成人在线视频播放| 黄色成人在线免费| 久久综合婷婷| 欧美婷婷久久| 亚洲精品专区| 欧美视频导航| 亚洲激情在线激情| 今天的高清视频免费播放成人| 亚洲欧美在线看| 亚洲精品在线三区| 欧美成人a∨高清免费观看| 先锋影音网一区二区| 国产精品h在线观看| 久久久噜噜噜久噜久久| 欧美日韩国产精品一卡| 99ri日韩精品视频| 亚洲国产精品电影在线观看| 亚洲精品中文字幕在线| 亚洲一级在线观看| 国产精品美女xx| 看片网站欧美日韩| 亚洲精品久久久久久久久久久久久| 欧美成人精品1314www| 欧美女激情福利| 亚洲精品国产精品国自产观看| 亚洲一区bb| 午夜日韩在线观看| 免费成人黄色片| 午夜激情一区| 欧美sm视频| 亚洲一区二区在线看| 激情成人中文字幕| 欧美大片第1页| 一区二区三区精品在线| 久久伊人免费视频| 老司机免费视频一区二区| 亚洲人成网站777色婷婷| 久久蜜桃资源一区二区老牛 | 欧美黄色片免费观看| 国产日韩欧美在线播放| 欧美日韩一区二区在线| 久久精品av麻豆的观看方式| 亚洲精品综合精品自拍| 一本一本a久久| 亚洲一级免费视频| 亚洲国产高清一区二区三区| 亚洲午夜久久久| 亚洲国产日韩欧美综合久久| 亚洲精品视频在线播放| 国内精品久久久| 国产精品免费一区豆花| 久久久久网站| 小黄鸭视频精品导航| 午夜在线一区| 亚洲精品日韩在线| 99视频一区二区| 亚洲第一成人在线| 亚洲精品一区二区三区婷婷月| 欧美影院一区| 久久久久一区二区三区四区| 亚洲国产欧洲综合997久久| 欧美成人四级电影| 亚洲男人的天堂在线| 欧美日韩一区二区在线播放| 久久久亚洲国产美女国产盗摄| 午夜精品免费| 在线综合+亚洲+欧美中文字幕| 亚洲经典自拍| 国产曰批免费观看久久久| 亚洲精品一二| 亚洲欧美日韩视频一区| 亚洲视频在线看| 亚洲国产一区二区三区青草影视 | 日韩视频中文| 欧美一区二区三区在线观看| 久久久久久久久久久久久久一区| 欧美日韩免费观看一区| 激情五月综合色婷婷一区二区| 国模精品一区二区三区| 亚洲国产精品久久久久婷婷884| 亚洲影院色无极综合| 久久精品国产一区二区三| 亚洲国产欧美精品| 亚洲性视频网站| 免费在线观看一区二区| 国产精品久久久久久久午夜| 国产日韩成人精品| 中日韩高清电影网| 亚洲毛片在线看| 欧美日韩亚洲综合在线| 亚洲欧美国产不卡|