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

小默

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

Windows驅(qū)動(dòng)編程基礎(chǔ)教程-譚文-代碼整理
基本上是教程上原代碼照抄,只給代碼做了個(gè)排列組合,改了一些作者的小筆誤
代碼全部測試通過,測試環(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 注冊表讀寫
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ǔ)教程-譚文》-字符串使用
 *測試環(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)存的分配與釋放
 *測試環(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
 *測試環(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
 *測試環(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
 *測試環(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ǔ)教程-譚文》- 文件操作
 *測試環(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 注冊表讀寫
/*
 *《Windows驅(qū)動(dòng)編程基礎(chǔ)教程-譚文》- 注冊表讀寫
 *測試環(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í)
 *測試環(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) 評論(0)  編輯 收藏 引用 所屬分類: Windows

導(dǎo)航

統(tǒng)計(jì)

留言簿(13)

隨筆分類(287)

隨筆檔案(289)

漏洞

搜索

積分與排名

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区视频观看| 国产精品成人在线| 亚洲精品中文字幕女同| 亚洲电影免费观看高清完整版| 免费亚洲一区| 亚洲精美视频| 亚洲天堂网在线观看| 亚洲一区二区三区高清| 亚洲欧美在线免费观看| 欧美伊人精品成人久久综合97| 欧美在线|欧美| 欧美电影在线免费观看网站| 欧美日韩在线观看视频| 国产日韩综合| 亚洲精选一区二区| 欧美一区二区免费观在线| 美女网站久久| 亚洲卡通欧美制服中文| 久久国产精品一区二区| 欧美日韩日韩| 一区二区三区在线免费观看| 99精品免费视频| 久久久99国产精品免费| 亚洲精品乱码久久久久久黑人| 亚洲欧美国产不卡| 欧美激情第六页| 国产综合色产在线精品| 中文精品99久久国产香蕉| 老司机久久99久久精品播放免费| 亚洲美女区一区| 久久久一二三| 国产精品视频午夜| 99精品国产99久久久久久福利| 久久久久九九九九| 亚洲视频在线观看视频| 欧美国产先锋| 亚洲国产欧美日韩另类综合| 性色av一区二区三区| 亚洲啪啪91| 麻豆精品在线视频| 国产自产在线视频一区 | 99亚洲视频| 美女精品国产| 欧美一区二区性| 国产伦精品一区二区三区| 久久综合九色综合欧美狠狠| 欧美性猛片xxxx免费看久爱 | 欧美精品尤物在线| 国产主播在线一区| 欧美一区二区三区日韩| 在线视频一区二区| 欧美日韩亚洲另类| 一本色道久久综合亚洲精品小说| 欧美激情偷拍| 久久天天综合| 亚洲国产1区| 久久免费午夜影院| 久久爱www.| 伊人久久亚洲美女图片| 久久手机精品视频| 久久久久久一区二区三区| 伊人成人开心激情综合网| 欧美伊人影院| 久久av红桃一区二区小说| 国产一区亚洲一区| 久久免费精品日本久久中文字幕| 久久av在线| 亚洲国产精品成人| 亚洲欧洲日韩女同| 欧美午夜在线视频| 欧美专区福利在线| 久久av红桃一区二区小说| 狠狠色综合色综合网络| 欧美电影打屁股sp| 欧美母乳在线| 午夜精品久久久久久久久久久| 亚洲与欧洲av电影| 国产丝袜一区二区三区| 久久在线免费观看视频| 欧美aaa级| 亚洲欧美综合| 欧美主播一区二区三区| 亚洲人成7777| 亚洲一区二区精品视频| 国内久久婷婷综合| 亚洲三级国产| 国产亚洲一区在线| 亚洲国产成人精品女人久久久 | 亚洲欧洲另类国产综合| 欧美三级电影一区| 久久精品五月婷婷| 欧美大胆a视频| 午夜精品成人在线| 久久久亚洲国产天美传媒修理工| 99精品国产在热久久| 亚洲字幕在线观看| 亚洲人成人99网站| 午夜影院日韩| 一本色道88久久加勒比精品 | 亚洲在线日韩| 亚洲国产女人aaa毛片在线| 亚洲视频1区| 亚洲精品韩国| 欧美一区二视频| 亚洲小说区图片区| 老司机精品视频一区二区三区| 亚洲一区二区三| 免费成人性网站| 久久国产主播精品| 欧美三区美女| 欧美高清视频| 国产一区二区三区日韩| 中文精品视频一区二区在线观看| 亚洲第一视频| 午夜在线精品偷拍| 亚洲一区二区免费视频| 欧美jizz19性欧美| 久久一区国产| 国产日韩精品在线播放| 中文日韩在线视频| 一区二区三区精品在线| 美日韩在线观看| 牛牛影视久久网| 激情六月婷婷综合| 欧美在线视频导航| 久久国产精品99国产| 国产精品免费一区二区三区观看| 亚洲精品免费在线播放| 日韩亚洲国产欧美| 欧美二区在线观看| 欧美激情一区二区三区四区| 在线日韩av| 美国十次成人| 欧美激情视频给我| 亚洲日本一区二区三区| 欧美r片在线| 亚洲激情国产精品| 夜夜嗨av一区二区三区网页| 欧美日本精品一区二区三区| 最新国产拍偷乱拍精品| 亚洲精品网址在线观看| 欧美精品在线视频观看| 夜夜爽www精品| 欧美一区二区三区免费看 | 亚洲国产精品视频| 亚洲欧洲日产国码二区| 欧美高清成人| 亚洲免费不卡| 午夜视频在线观看一区二区三区| 国产精品久久久久久久久动漫| 亚洲一级特黄| 久久久www成人免费毛片麻豆| 国语自产在线不卡| 久久综合中文| av成人激情| 久久久天天操| 日韩视频永久免费观看| 国产精品xnxxcom| 欧美一区二区福利在线| 欧美高清视频在线| 亚洲欧美日本国产有色| 国产在线精品成人一区二区三区 | 国内自拍亚洲| 免费观看30秒视频久久| 亚洲精品久久视频| 久久本道综合色狠狠五月| 曰本成人黄色| 国产精品二区二区三区| 久久精品综合网| 一本色道久久综合亚洲精品按摩| 久久九九热re6这里有精品| 亚洲电影专区| 国产精品网站在线| 欧美福利视频网站| 欧美中文在线观看| 一区二区毛片| 欧美激情一区二区三区在线视频观看| 一二三四社区欧美黄| 国产一区二区激情| 欧美私人啪啪vps| 欧美xxx在线观看| 性一交一乱一区二区洋洋av| 亚洲欧洲在线一区| 久久综合国产精品台湾中文娱乐网| 日韩亚洲一区二区| 在线成人av.com| 国产欧美大片| 欧美特黄视频| 欧美另类高清视频在线| 久久综合狠狠综合久久综合88| 99re6热在线精品视频播放速度| 卡一卡二国产精品| 久久精品国产99国产精品澳门| 亚洲免费黄色| 亚洲国产精品一区| 国语自产精品视频在线看| 国产精品区二区三区日本| 欧美日韩免费网站| 欧美精品一区二区三区蜜臀| 蜜桃av综合|