µ±Ç°Î»ÖãºÊ×Ò³ > £¨×ªÔØ£©WindowsÎļþϵͳ¹ýÂËÇý¶¯¿ª·¢½Ì³Ì
// È»ºóÎÒÉú³É¿ØÖÆÉ豸,ËäÈ»ÏÖÔÚÎҵĿØÖÆÉ豸ʲô¶¼²»¸É wd_ustr_init(&name,L\status = wdff_cdo_create(driver,0,&name,&g_cdo);
if(!wd_suc(status)) {
if(status == wd_stat_path_not_found) {
// ÕâÖÖÇé¿ö·¢ÉúÓÚFileSystemFilters·¾¶²»´æÔÚ¡£Õâ¸ö·¾¶ÊÇ // ÔÚxpÉϲżÓÉϵġ£ËùÒÔ2000Ï»áÔËÐе½ÕâÀï wd_ustr_init(&name,L\status = wdff_cdo_create(driver,0,&name,&g_cdo); };
if(!wd_suc(status)) {
wd_printf0(\return status; } }
wd_printf0(\return status; }
ΪÁËÈôúÂë¿´ÆðÀ´ÏóÉϱߵÄÄÇÑù£¬ÎÒ²»µÃ²»×öÁ˺ܶàת»»¡£Èç
#define DriverEntry wd_main
Ò»ÖÖˬµÄ¸Ð¾õ£¬ÖÕÓÚ¿ÉÒÔÔÚд¿´ÆðÀ´¸üÏóÊÇmain()µÄº¯ÊýÖй¤×÷ÁË¡£ wd_dev_create Õâ¸öº¯ÊýÄÚ²¿µ÷ÓõÄÊÇIoCreateDevice.¶øwd_sucʵ¼ÊÉÏÊÇSUCCESS()ÕâÑùµÄºê¡£
// ----------------------wdf.hÖеÄÄÚÈÝ------------------------------ #include \
#define in IN #define out OUT
#define optional OPTIONAL
#define wd_ustr UNICODE_STRING #define wdp_ustr PUNICODE_STRING #define wd_main DriverEntry
// É豸¡¢Çý¶¯¶ÔÏóÀàÐÍ
typedef DRIVER_OBJECT wd_drv;
typedef DEVICE_OBJECT wd_dev; typedef DRIVER_OBJECT wd_pdrv; typedef PDEVICE_OBJECT wd_pdev;
enum {
wd_dev_disk_fs = FILE_DEVICE_DISK_FILE_SYSTEM,
wd_dev_cdrom_fs = FILE_DEVICE_CD_ROM_FILE_SYSTEM, wd_dev_network_fs = FILE_DEVICE_NETWORK_FILE_SYSTEM };
// ״̬Ïà¹ØµÄÀàÐͺͺê typedef NTSTATUS wd_stat;
enum {
wd_stat_suc = STATUS_SUCCESS,
wd_stat_path_not_found = STATUS_OBJECT_PATH_NOT_FOUND, wd_stat_insufficient_res = STATUS_INSUFFICIENT_RESOURCES, wd_stat_invalid_dev_req = STATUS_INVALID_DEVICE_REQUEST, wd_stat_no_such_dev = STATUS_NO_SUCH_DEVICE,
wd_stat_image_already_loaded = STATUS_IMAGE_ALREADY_LOADED, wd_stat_more_processing = STATUS_MORE_PROCESSING_REQUIRED, wd_stat_pending = STATUS_PENDING };
_inline wd_bool wd_suc(wd_stat state) {
return NT_SUCCESS(state); }
#define wd_printf0 DbgPrint
_inline wd_void wd_ustr_init(in out wd_ustr* str, in const wd_wchar* chars) {
RtlInitUnicodeString(str,chars); };
_inline wd_void wd_ustr_init_em( in out wd_ustr*str, in wd_wchar *chars, in wd_size size) {
RtlInitEmptyUnicodeString(str,chars,size); };
wdf.hÕâ¸öÎļþÎÒ½ö½ö½ÚÑ¡ÁËÐèÒªµÄ²¿·Ö¡£ÒÔÉÏÄúÒѾӵÓÐÁËÒ»¸ö¼òµ¥µÄ¡°Çý¶¯¡±µÄÍêÕûµÄ´úÂë¡£ËüÉõÖÁ¿ÉÒÔ±àÒ룬°²×°£¨ÇëÐÞ¸Äsfilter.infÎļþ£¬Æä·½·¨²»¹ýÊǽ«¶à´¦sfilter¸ÄΪ\Ï£ÍûÕâ¸ö¹ý³ÌÖÐÄú²»»á³öÏÖÎÊÌ⣩¡£È»ºó°Ñwdf.hºÍwdf_filter.c·ÅÔÚÄúн¨Á¢µÄĿ¼Ï£¬Õâ¸öĿ¼Ï»¹Ó¦¸ÃÓÐÁíÁ½¸öÎļþ¡£Ò»¸öÊÇMakefile,Çë´ÓsfilterĿ¼Ï¿½±´¡£ÁíÒ»¸öÊÇSOURCES£¬ÇëÊäÈëÈçÏÂÄÚÈÝ£º TARGETNAME=our_fs_filter TARGETPATH=obj
TARGETTYPE=DRIVER DRIVERTYPE=FS BROWSER_INFO=1 SOURCES=wdf_filter.c
ʹÓÃddk±àÒëÖ®ºóÄú½«µÃµ½our_fs_filter.sys.°ÑÕâ¸öÎļþÓëǰËùÃèÊöµÄinfÎļþͬһĿ¼£¬°´ÉϽÚËùÐðÊö·½·¨°²×°¡£
Õâ¸öÇý¶¯²»ÆðÈκÎ×÷Ó㬵«ÊÇÄãÒѾ³É¹¦µÄÍê³ÉÁË\
2. ·Ö·¢Àý³Ì,fast io
ÉÏÒ»½Ú½ö½öÉú³ÉÁË¿ØÖÆÉ豸¶ÔÏó¡£µ«ÊDz»ÒªÍü¼Ç£¬Çý¶¯¿ª·¢µÄÖ÷Òª¹¤×÷ÊÇ׫д·Ö·¢Àý³Ì(dispatch functions.).½ÓÉÏÒ»½Ó£¬ÎÒÃÇÒѾ֪µÀ×Ô¼ºµÄDriverObject±£´æÔÚÉÏÎÄ´úÂëµÄdriverÖС£ÏÖÔÚÎÒдÈçÏÂÒ»¸öº¯ÊýÀ´Ö¸¶¨Ò»¸öĬÈϵÄdispatch function¸øËü¡£
//-----------------wdf.hÖеĴúÂë---------------------- typedef PDRIVER_DISPATCH wd_disp_fuc;
_inline wd_void wd_drv_set_dispatch(in wd_drv* driver, in wd_disp_fuc disp) {
wd_size i;
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) driver->MajorFunction = disp; }
ÔÚǰ±ßµÄwd_mainÖУ¬ÎÒÖ»Òª¼Ó
wd_drv_set_dispatch(driver,my_dispatch_func);
¾ÍΪÕâ¸öÇý¶¯Ö¸¶¨ÁËÒ»¸öĬÈϵÄDispatch Function.ËùÓеÄirpÇëÇ󣬶¼»á±»·¢Ë͵½Õâ¸öº¯Êý¡£µ«ÊÇ£¬ÎÒ¿ÉÄܲ»Ï£ÍûÕâ¸öº¯Êý´¦Àí¹ýÓÚ¸´ÔÓ£¬¶øÏ£Íû°ÑһЩ³£¼ûµÄÇëÇó¶ÀÁ¢³öÀ´£¬ÈçRead,Write,Create,Close,ÄÇÎÒÓÖдÁ˼¸¸öº¯ÊýרÃÅÓÃÀ´ÉèÖÃÕ⼸¸öDispatch Functions.
//-----------------wdf.hÖеĴúÂë---------------------- _inline wd_void wd_drv_set_read( in wd_drv* driver, in wd_disp_fuc read) {
driver->MajorFunction[IRP_MJ_READ] = read; }
_inline wd_void wd_drv_set_write( in wd_drv* driver, in wd_disp_fuc write) {
driver->MajorFunction[IRP_MJ_WRITE] = write; }
wd_void wd_drv_set_create(in wd_drv* driver, in wd_disp_fuc create) {
driver->MajorFunction[IRP_MJ_CREATE] = create;
driver->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = create; driver->MajorFunction[IRP_MJ_CREATE_MAILSLOT] = create; }
wd_void wd_drv_set_file_sys_control(in wd_drv* driver, in wd_disp_fuc control) {
driver->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = control; }
wd_void wd_drv_set_clean_up(in wd_drv* driver, in wd_disp_fuc clean_up) {
driver->MajorFunction[IRP_MJ_CLEANUP] = clean_up; }
wd_void wd_drv_set_close(in wd_drv* driver, in wd_disp_fuc close) {
driver->MajorFunction[IRP_MJ_CLOSE] = close; }
±ð¿´ÎÒÂÞÁÐn¶à´úÂ룬Æäʵ¾ÍÊÇÔÚÉèÖÃdriver->MajorFunctionÕâ¸öÊý×é¶øÒÑ¡£Òò´ËÔÚwd_main¶Ôdispatch functionsµÄÉèÖ㬾ͱä³ÉÁËϱßÕâÑùµÄ£º
¹²·ÖÏí92ƪÏà¹ØÎĵµ