程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 設置編譯內核lib驅動及應用層dll的source文件

設置編譯內核lib驅動及應用層dll的source文件

編輯:關於C語言

驅動層的一些策略性代碼,算法性代碼,和

驅動內API不相關的代碼,可以用在應用層進行測試,

以提高編寫的速度,

這是明顯的,應用層在這方面的有其優點.

那麼如何來實現這個功能.

主要是在寫兩個文件

一個是sources文件,  一個是Sample.def文件.

一.    sources文件

KERNEL_BUILD=1                    #若想編譯成DLL的話 那麼在之前加#號

TARGETNAME=Sample
DLLDEF=Sample.def                 #輸出函數的.def文件
TARGETPATH=../../bin                 #文件輸出目錄 (.sys文件或.dll文件)
TARGETPATHLIB=../../lib            #.lib輸出目錄

!ifdef KERNEL_BUILD               #若定義了KERNEL_BUILD 則生成一個.sys文件 相當於內核庫 
TARGETTYPE=EXPORT_DRIVER
!else                                              #若沒有定義,則生成一個.dll 
TARGETTYPE=DYNLINK          #生成一個dll
USE_MSVCRT=1
DLLENTRY=_DllMainCRTStartup        #dll的入口函數
INCLUDES= $(INCLUDES); $(DDK_INC_PATH);      #H文件的目錄
INCLUDES= $(INCLUDES); $(SDK_INC_PATH);
TARGETLIBS=$(TARGETLIBS) $(SDK_LIB_PATH)\kernel32.lib     #LIB目錄  kernel32.lib  gdi32.lib advapi32.lib
TARGETLIBS=$(TARGETLIBS) $(SDK_LIB_PATH)\gdi32.lib
TARGETLIBS=$(TARGETLIBS) $(SDK_LIB_PATH)\advapi32.lib
TARGETLIBS=$(TARGETLIBS) $(SDK_LIB_PATH)\ntdll.lib
!endif


INCLUDES=$(INCLUDES); ../../inc;                       #自己的.H文件目錄
INCLUDES=$(INCLUDES); ../../inc/SampleOne; #自己的.H文件目錄二
INCLUDES=$(INCLUDES); ../../inc/SampleTwo;#自己的.H文件目錄三


SOURCES=\
A.cpp\
B.cpp\
C.cpp\
D.cpp\
 

 

 

二. Sample.def文件

NAME "Sample.sys"        #若為內核庫則為Sample.sys   若為應用層dll則修改為Sample.dll
EXPORTS
 DllInitialize PRIVATE
 DllUnload PRIVATE

AFunc

BBFunc

 

 

三.函數庫入口函數

#include "ntddk.h"

extern "C"{
 NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pusRegPath);
 void DriverUnload(PDRIVER_OBJECT pDriverObject);
 NTSTATUS DllInitialize(PUNICODE_STRING RegistryPath);
 NTSTATUS DllUnload();
};

void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
 DllUnload();
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pusRegPath)
{
 DllInitialize(pusRegPath);
 pDriverObject->DriverUnload = DriverUnload;
 return STATUS_SUCCESS;
}


NTSTATUS DllInitialize(PUNICODE_STRING RegistryPath)
{
 DbgPrint("Sample: DllInitialize(%wZ)\n", RegistryPath);
 return STATUS_SUCCESS;
}

NTSTATUS DllUnload()
{
 DbgPrint("Sample: DllUnload\n");
 return STATUS_SUCCESS;
}

 

//這裡要注意的是 

//DDK 中編譯器默認為  _stdcall

//而VC中編譯默認為 _cdecel 

//因此在這裡顯式加入 _stdcall 防止編譯器link錯誤

 

 

ULONG _stdcall TestFun(void)             

{

    return 100;

}

 

示例代碼下載地址:

http://download.csdn.net/source/2799981

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved