導航:首頁 > 凈水問答 > 文件過濾驅動C

文件過濾驅動C

發布時間:2022-06-30 21:07:49

㈠ 文件過濾驅動程序中volume和磁碟是什麼關系

DB庫、dat、cfg……多了,只需要研發者自行設置一種就可以。關鍵是你要做什麼?要解密?

㈡ 如何設計單機版的文件過濾驅動

透明指的是用戶在操作的時候,雖然後台在自動的進行加解密,但是用戶根本就內不知道加密的存在,容就像中間隔了一層透明的玻璃一樣。透明的好處在於不改變用戶的操作,一切都和加密之前一樣,甚至在有些企業安裝加密後都無需通知所有的員工,就像加密並不存在一樣,只是加密文件到了企業安全環境的外部才會發現文件無法打開。透明的程度也是加密軟體一個很重要的方面,例如:正在編輯一個Word文件時,能否拷貝或者使用其他程序來讀取這個文件,如果不能那麼這里就不夠透明,在一些PDM的文檔管理軟體中就是文件在一個應用程序打開狀態時另一個應用程序進行檢入。透明的程度越高,用戶使用時就越是和未加密時一樣,透明程序越低用戶就會發現有越多的操作受到限制,和加密前有較大的差異。

㈢ 如何構造一個簡單的USB過濾驅動程序

本文分三部分來介紹如何構造一個簡單的USB過濾驅動程序,包括「基本原理」、「程序的實現」、「使用INF安裝」。此文的目的在於希望讀者了解基本原理後,可以使用除DDK以外最流行也最方便的驅動開發工具DriverStudio來實現一個自己的過濾驅動,並正確地安裝。

一、基本原理
我們知道,WDM(和KDM)是分層的,在構造設備棧時,IO管理器可以使一個設備對象附加到另外一個初始驅動程序創建的設備對象上。與初始設備對象相關的驅動程序決定的IRP,也將被發送到附加的設備對象相關的驅動程序上。這個被附加的驅動程序便是過濾驅動程序。如右圖,過濾驅動可以在設備棧的任何層次中插入。IO管理器發出的IRP將會沿著右圖的順序從上往下傳遞並返回。因此,我們可以使用過濾驅動程序來檢查、修改、完成它接收到的IRP,或者構造自己的IRP。
上面這種文字是很枯燥的,好在「前人」已經寫過一些範例以供我們更好地理解這些概念。讀過Waltz Oney的《Programming Windows Driver Mode》一書的讀者大概都知道Waltz Oney提供的範例中有一個關於USB過濾器(第九章)的例子,而在此基礎上,《USB Design By Example》(http://www.usb-by-example.com)的作者John Hyde實現了一個USB鍵盤過濾驅動程序,即給此程序增加了一個「攔截(Intercept)」功能來處理USB鍵盤的Report以實現特定的功能:當驅動程序在IRP_MJ_INTERNAL_DEVICE_CONTROL設置的完成常式從USB設備攔截到一個Get_Report_Descriptor時,攔截程序將此Descriptor中的USAGE值從「Keyboard」改為「UserDefined」,再返回給系統。
我們可以從這個例子中獲得一些靈感,比如,在Win2k下,鍵盤是由OS獨占訪問的,我們可以通過這種方式使之可以讓用戶自由訪問;我們也可以攔截其他Report_Descriptor,將部分鍵重新定義,以滿足特殊的要求;如果你願意再做一個用戶態的程序,你還可以將你攔截到的鍵值傳遞給你的用戶態程序,以實現象聯想、實達等國內電腦大廠出品的那些鍵盤上的各種實用的功能。

二、程序的實現
Waltz Oney和John Hyde的例子已經寫得很詳細了,讀者可以不用修改一個位元組便順利地編譯生成一個過濾驅動程序。本文的目的在於使用DriverStudio組件Driverworks來實現同樣的功能。
相信讀者讀到這篇文章時,已經對DriverStudio有了很多的了解。DriverStudio作為一個以C++為基礎的「快速」驅動開發工具,它封裝了基本上所有的DDK的函數,其集成在VC++中的DriverWizard,可以很方便地引導你完成設備驅動程序開發的全過程,能根據你的硬體種類自動生成設備驅動程序源代碼,並提供了很多范常式序。當然,這些例子中便包含一個USB Filter驅動程序的框架。在不侵犯版權的前提下,充分利用現有共享的、免費的、授權的代碼是我們的一貫作法。我們下面便以此範例為基礎來作修改。
我們的目的是做一個HID小驅動程序hisb.sys的Lower Filter,它附加在「人機介面設備」 ,通過攔截USB的Get_Report_Descriptor來修改其返回值,當它發現該Descriptor的Usage 為「Keyboard」時,將其改為「UserDefined」,如此我們便可以完全控制這只鍵盤。具體做法是,攔截IRP_MJ_INTERNAL_DEVICE_CONTROL,並檢查其IOCTL代碼及URB,如果滿足IOCTRL功能代碼為IOCTL_INTERNAL_USB_SUBMIT_URB以及URB功能代碼為URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE的條件,即上層驅動發來Get_Report_Descriptor請求時,設置一個完成常式,在這個完成常式中,我們將判斷Usage的值,將Usage由「6(Keyboard)」時,將其改為「0(UserDefined)」。
打開C:\Program Files\NuMega\DriverStudio\DriverWorks\Examples\wdm\usbfilt目錄(具體目錄依你的DriverStudio所安裝的目錄不同而不同) ,再打開工程文件usbfilt.dsw,我們先看一下代碼。
程序由兩個類組成,一個是Driver類,一個是Device類。Driver類包括:
入口函數DriverEntry:
DECLARE_DRIVER_CLASS(UsbFilterDriver, NULL)
/////////////////////////////////////////////////////////////////////
// Driver Entry
//
NTSTATUS UsbFilterDriver::DriverEntry(PUNICODE_STRING RegistryPath)
{
T << "UsbFilterDriver::DriverEntry\n";

m_Unit = 0;
return STATUS_SUCCESS;

// The following macro simply allows compilation at Warning Level 4
// If you reference this parameter in the function simply remove the macro.
UNREFERENCED_PARAMETER(RegistryPath);
}
AddDevice函數
NTSTATUS UsbFilterDriver::AddDevice(PDEVICE_OBJECT Pdo)
{
T << "UsbFilterDriver::AddDevice\n";
UsbFilterDevice * pFilterDevice = new (
static_cast<PCWSTR>(NULL),
FILE_DEVICE_UNKNOWN,
static_cast<PCWSTR>(NULL),
0,
DO_DIRECT_IO
)
UsbFilterDevice(Pdo, m_Unit);
if (pFilterDevice)
{
NTSTATUS status = pFilterDevice->ConstructorStatus();
if ( !NT_SUCCESS(status) )
{
T << "Failed to construct UsbFilterDevice"
<< (ULONG) m_Unit
<< " status = "
<< status
<< "\n";

delete pFilterDevice;
}
else
{
m_Unit++;
}
return status;
}
else
{
T << "Failed to allocate UsbFilterDevice"
<< (ULONG) m_Unit
<< "\n";
return STATUS_INSUFFICIENT_RESOURCES;
}
}

這兩段代碼基本上和自動生成的代碼差不多。AddDevice的作用是構造一個過濾器的實例。
關鍵的代碼在Device類。在這個類里,我們把過濾器插入設備棧,並攔截IRP,用自己的完成常式來實現特定的功能。
Device構造函數
UsbFilterDevice::UsbFilterDevice(PDEVICE_OBJECT Pdo, ULONG Unit) :
KWdmFilterDevice(Pdo, NULL)
{
T << "UsbFilterDevice::UsbFilterDevice\n";
// Check constructor status
if ( ! NT_SUCCESS(m_ConstructorStatus) )
{
return;
}
// Remember our unit number
m_Unit = Unit;
// initialize the USB lower device
m_Usb.Initialize(this, Pdo);
NTSTATUS status = AttachFilter(&m_Usb); //Attach the filter
if(!NT_SUCCESS(status))
{
m_ConstructorStatus = status;
return;
}
SetFilterPowerPolicy();
SetFilterPnpPolicy();
}
在DDK中,我們用IoAttachDevice將設備對象插入設備棧中。DriverStudio封裝了這個函數。在DriverStudio中,其他驅動程序需要用Initialize來初始化設備對象和介面,對於過濾驅動,我們關鍵是需要Attachfilter將其附加在堆棧中。
對於大部分如IRP_MJ_SYSTEM_CONTROL等IRP,我們所做的只需用PassThrough(Irp)將其直接往設備棧下層傳遞,不需要做任何工作。這些代碼我們就不一一列舉了。下面的部分才是本文的關鍵。
我們知道,HIDUSB.SYS是使用內部IOCTRL發出URB給USB類驅動程序(USBD)讀取數據的,那麼,HIDUSB首先必須構造一個IRP_MJ_INTERNAL_DEVICE_CONTROL,它的IOCTL功能碼為IOCTL_INTERNAL_USB_SUBMIT_URB(發出URB的內部IOCTL)。另外,因為我們要檢查並修改的是USB鍵盤某個介面的報告描述,那麼這個URB應該是URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE,如下:
NTSTATUS UsbFilterDevice::InternalDeviceControl(KIrp I)
{
T << "UsbFilterDevice::InternalDeviceControl\n";
// Pass through IOCTLs that are not submitting an URB
//不是我們感興趣的IOCTL不要理它
if (I.IoctlCode() != IOCTL_INTERNAL_USB_SUBMIT_URB)
return DefaultPnp(I);

PURB p = I.Urb(CURRENT); // get URB pointer from IRP

//不是我們感興趣的URB,也不要理它,
if (p->UrbHeader.Function !=
URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE)
return DefaultPnp(I);
//符合要求的IRP才被設置完成常式
return PassThrough(I, LinkTo(DeviceControlComplete), this);
}
在設置好條件以後,再來實現完成常式。所有的檢查、修改等動作都是在完成常式裡面完成的。
NTSTATUS UsbFilterDevice::DeviceControlComplete(KIrp I)
{
PURB p = I.Urb(CURRENT);
if(p)
{
//攔截到設備返回的描述表,
char* DescriptorBuffer = (char*)p->UrbControlDescriptorRequest.TransferBuffer;
//指向第三個位元組,表示設備Usage屬性的值
DescriptorBuffer += 3;
//如果值為6則改成0,6表示hid鍵盤,0表示未知設備
//在設備管理器裡面,原來的hid兼容鍵盤就不復存在了,取而代之的則是hid兼容設備
if ((*DescriptorBuffer&0xff) == 6)
*DescriptorBuffer = 0;
}
return I.Status();
}
讀者可以對照DriverWorks中的例子,直接替換掉(或者修改)上面這兩個函數,再編譯一下,便可以得到一個完整的鍵盤過濾器驅動程序。
其實,只要弄清楚了我們需要做些什麼動作,在DriverStudio裡面只需要寫少量的關鍵代碼,便可實現我們的要求,其餘的大部分工作,或有範例可供參考,或有Driver Wizard自動生成。
從上面可以看出,我們只需要修改這兩個函數,攔截合適的IRP,便可以在完成常式裡面實現我們特定的要求。正如開頭所說,我們也可以攔截其他的IRP,攔截其他的URB,或者攔截特定鍵盤的按鍵鍵值,將之傳遞到用戶態,以方便實現聯想、實達等隨機配備的多功能鍵盤的功能。

三、使用INF安裝驅動
在完成了驅動以後,還必須把它安裝到系統裡面,驅動程序才會起作用。一般來說,我們都必須為我們的驅動程序提供一個inf文件,以便於用戶安裝或者維護。對於新手來說,過濾驅動程序的inf或許有些棘手。所以,針對本文所描述的驅動,我們提供一個Win98下的安裝範例usbkey.inf,範例中「;」後的文字是註解,以方便讀者理解。

; usbkey.INF
;
; Installs Lower Level Filter for a HID keyboard device
;
; (c) Copyright 2001 SINO Co., Ltd.
;
[Version]
;」CHICAGO」表示Win9x平台
Signature="$CHICAGO$"
;鍵盤所屬類名
Class=HID
ClassGUID={745a17a0-74d3-11d0-b6fe-00a0c90f57da}
;驅動程序提供者,此信息會顯示在設備屬性的「常規」頁
Provider=%USBDBE%
LayoutFile=layout.inf
;顯示在驅動程序文件詳細資料窗口
DriverVer=11/12/2001,4.10.2222.12

;[ControlFlags]
;ExcludeFromSelect = *

;驅動程序安裝目錄,inf會將我們的驅動程序安裝到如下目錄
;記得Destinationdir後面一定要帶一個「s」
[DestinationDirs]
DefaultDestDir = 10,system32\drivers

;要增加的注冊表項
[ClassInstall]
Addreg=HIDClassReg

[HIDClassReg]
HKR,,,,%HID.ClassName%
HKR,,Icon,,-20

;製造商
[Manufacturer]
%USBDBE%=USBDBE

[USBDBE]
;我們所要附加過濾驅動程序的設備ID。這個ID可以從IC的規范上得來,也可以
;用hidview.exe讀出,或者從注冊表HKLM\Enum\hid和usb項找出
%HID.DeviceDesc% = Keypad_Inst, USB\VID_05AF&PID_0805&MI_00

;要安裝的文件和需要修改的注冊表項
;Install usbkey driver
[Keypad_Inst]
CopyFiles=Keypad_Inst.CopyFiles
AddReg=Keypad_Inst.AddReg

[Keypad_Inst.CopyFiles]
hisb.sys
hidparse.sys
hidclass.sys
usbfilt.sys

[Keypad_Inst.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,"hisb.sys"

[Keypad_Inst.HW]
AddReg=Keypad_Inst.AddReg.HW

;Lowerfilters表示是低層過濾驅動,如果是上層過濾驅動,則必須改為upperfilters
[Keypad_Inst.AddReg.HW]
HKR,,"LowerFilters",0x00010000,"usbfilt.sys"

;HID設備所需要安裝的文件和注冊表中需要修改的地方
;Install USBHIDDevice
[USBHIDDevice]
CopyFiles=USBHIDDevice.Copy
AddReg=USBHIDDevice.AddReg

[USBHIDDevice.Copy]
hidclass.sys
hisb.sys
hidparse.sys

[USBHIDDevice.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,"hisb.sys"

;以下定義需要在上面某些地方使用時替換的字元串
[strings]
USBDBE = "SINO Co., Ltd."
HID.DeviceDesc = "SINO USB MultiKeyboard"
HID.HIDDeviceDesc = "Human Interface Devices"
HID.DefaultDevice = "HID Default Device"
HID.ClassName = "Human Input Devices (HID)"
HID.SvcDesc = "Microsoft HID Class Driver"

其實最簡單的寫inf的方式,是找一些類似設備的inf文件或範例來修改。在不侵權的前提下,充分利用現有資源是我們的一貫原則。

㈣ 如何卸載反病毒文件系統過濾驅動

您好:

這樣的情況可能是因為您以前安裝的安全軟體並沒有徹底卸載干凈回導致的軟體沖突,建議答您使用騰訊電腦管家的軟體管理裡面的卸載功能將以前安裝的安全軟體卸載干凈,並使用垃圾清理功能清理完卸載殘留以後再安裝新的安全軟體就可以了,並建議您使用騰訊電腦管家保護您的電腦,您可以點擊這里下載最新版的騰訊電腦管家:騰訊電腦管家最新版下載

騰訊電腦管家企業平台:http://..com/c/guanjia/

㈤ 請教用文件過濾驅動的方式透明加密linux中的文件

文件系統過濾驅動是一種可選的,為文件系統提供具有附加值功能的驅動專程序。文件系統過濾驅動是一屬種核心模式組件,它作為Windows NT執行體的一部分運行。 文件系統過濾驅動可以過濾一個或多個文件系統或文件系統卷的I/O操作。按不同的種類劃分,...

㈥ 如何在文件過濾驅動中啟動一個應用層進程

一般來說,那些在你電腦上安裝的應用程序在後台運行的進程是可以關閉的,而那些windows自動運行的服務程序/進程是萬萬不可關閉的(可以在進程中的描述一欄中找到)。但是,這並不意味著所有後台運行的應用程序/進程(你所安裝的)都可以關閉,比如的數據傳輸通道,殺毒的後台防護程序等等,這些也不能關閉。還有一些進程,比如音效卡等。其實,如果你是想關閉某個後台程序以用來釋放內存的話,可以用殺毒自帶的釋放內存工具來實現,一般來說,還是不要直接通過任務管理器關閉後台進程,這樣可能會讓電腦崩潰,也可能會丟失那些被你關閉的應用程序的數據。

㈦ linux怎樣載入文件過濾驅動

文件系統過濾驅動是一種可選的,為文件系統提供具有附加值功能的驅動程序。文件系統過濾驅動是一種核心模式組件,它作為Windows NT執行體的一部分運行。
文件系統過濾驅動可以過濾一個或多個文件系統或文件系統卷的I/O操作。按不同的種類劃分,文件系統過濾驅動可以分成日誌記錄、系統監測、數據修改或事件預防幾類。通常,以文件系統過濾驅動為核心的應用程序有防毒軟體、加密程序、分級存儲管理系統等。
二、文件系統過濾驅動並不是設備驅動
設備驅動是用來控制特定硬體I/O設備的軟體組件。例如:DVD存儲設備驅動是一個DVD驅動。
相反,文件系統過濾驅動與一個或多個文件系統協同工作來處理文件I/O操作。這些操作包括:創建、打開、關閉、枚舉文件和目錄;獲取和設置文件、目錄、卷的相關信息;向文件中讀取或寫入數據。另外,文件系統過濾驅動必須支持文件系統特定的功能,例如緩存、鎖定、稀疏文件、磁碟配額、壓縮、安全、可恢復性、還原點和卷裝載等。
下面兩部分詳細的闡述了文件系統過濾驅動和設備驅動之間的相似點與不同點。

三、安裝文件系統過濾驅動
對於Windows XP和後續操作系統來說,可以通過INI文件或安裝應用程序來安裝文件系統過濾驅動(對於Windows 2000和更早的操作系統,過濾驅動通常通過服務控制管理器Service Control Manager來進行安裝)。
四、初始化文件系統過濾驅動
與設備驅動類似,文件系統過濾驅動也使用DriverEntry常式進行初始化工作。在驅動程序載入後,載入驅動相同的組件將通過調用驅動程序的 DriverEntry常式來對驅動程序進行初始化工作。對於文件系統過濾驅動來說,載入和初始化過濾驅動的系統組件為I/O管理器。
DriverEntry常式運行於系統線程上下文中,其IRQL = PASSIVE_LEVEL。本常式可分頁,詳細信息參見MmLockPagableCodeSection。
DriverEntry常式定義如下:
NTSTATUS
DriverEntry (
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
本常式有兩個輸入參數。第一個參數,DriverObject為系統在文件系統過濾驅動載入時所創建的驅動對象;第二個參數,RegistryPath為包含驅動程序注冊鍵路徑的Unicode字元串。
文件系統過濾驅動按如下順序執行DriverEntry常式:

01、創建控制設備對象:

文件系統過濾驅動的DriverEntry常式通常以創建控制設備對象作為該常式的起始。創建控制設備對象的目的在於允許應用程序即使在過濾驅動載入到文件系統或卷設備對象之前也能夠直接與過濾驅動進行通信。
注意:文件系統也會創建控制設備對象。當文件系統過濾驅動將其自身附加到文件系統之上時(而不是附加到某一特定文件系統卷),過濾驅動同樣將其自身附加到文件系統的控制設備對象之上。

在FileSpy驅動範例中,控制設備對象按如下方式創建:

RtlInitUnicodeString(&nameString, FILESPY_FULLDEVICE_NAME);
status = IoCreateDevice(
DriverObject, //DriverObject
0, //DeviceExtensionSize
&nameString, //DeviceName
FILE_DEVICE_DISK_FILE_SYSTEM, //DeviceType
FILE_DEVICE_SECURE_OPEN, //DeviceCharacteristics
FALSE, //Exclusive
&gControlDeviceObject); //DeviceObject

RtlInitUnicodeString(&linkString, FILESPY_DOSDEVICE_NAME);
status = IoCreateSymbolicLink(&linkString, &nameString);

與文件系統不同,文件系統過濾驅動並不是一定要為其控制設備對象命名。如果傳遞給DeviceName參數一個非空(Non-NULL)值,該值將作為控制設備對象的名稱。接下來,在前面的代碼範例中DriverEntry可以調用IoCreateSymbolicLink常式來將該對象的核心模式名稱與應用程序可見的用戶模式名稱關聯到一起(同樣可以通過調用IoRegisterDeviceInterface來使設備對象對應用程序可見)。
注意:由於控制設備對象是唯一不會附加到設備堆棧中的設備對象,因此控制設備對象是唯一的可安全命名的設備對象。由此,是否為文件系統過濾驅動的控制設備對象是否命名是可選的。
注意:文件系統的控制設備對象必須命名。過濾設備對象從不命名。

㈧ 文件過濾驅動開發中,在IRP_MJ_WRITE 中獲取將要寫入文件的內容,請問這些內容是以什麼方式展示的呢如何

讀IRP的緩沖區啊。。。

㈨ 文件過濾驅動和磁碟過濾驅動有什麼區別

神馬狗屁老師教的啊

㈩ 怎麼用代碼實現WDM文件過濾驅動安裝

為了讓這個驅動被系統載入,必須創建一個inf文件。由於是使用現成的例子,因此這一步也可以省下來。直接右鍵點擊例子中的inf文件,在彈出的菜單中選擇「安裝」即可。
這里要注意的是,inf中的StartType參數,它可以控制驅動被載入的方式:
SERVICE_AUTO_START (2) 安全模式下不會自動載入 SERVICE_BOOT_START (0) 在系統安全模式下啟動時 驅動也會自動載入
SERVICE_DEMAND_START(3) 則驅動不會自動載入
因為是測試,我使用SERVICE_DEMAND_START,即由手動載入驅動。例子是miniFilter驅動,因此可以在命令提示行中用「fltmc load 驅動名稱」來載入,相應的卸載是「fltmc unload」。如果是其它驅動,則用"net start 驅動名稱"來載入,相應的卸載是"net stop 驅動名稱"。注意驅動名稱不是文件名,而是inf中[Settings]的ServiceName值。驅動要發布時,也可以通過CreateService & StartService API來動態安裝。
Inf文件的寫法,可以參考例子,或者拿現成的改一改。下面的是摘自驅動開發網的
XiangXiangRen整理的Inf文件,改起來比較方便,謝謝XiangXiangRen

閱讀全文

與文件過濾驅動C相關的資料

熱點內容
液相用溶劑過濾器 瀏覽:674
納濾水導電率 瀏覽:128
反滲透每小時2噸 瀏覽:162
做一個純凈水工廠需要多少錢 瀏覽:381
最終幻想4回憶技能有什麼用 瀏覽:487
污水提升器采通 瀏覽:397
反滲透和不發滲透凈水器有什麼區別 瀏覽:757
提升泵的揚程 瀏覽:294
澤德提升泵合肥經銷商 瀏覽:929
飲水機後蓋漏水了怎麼辦 瀏覽:953
小型電動提升器 瀏覽:246
半透膜和細胞膜區別 瀏覽:187
廢水拖把池 瀏覽:859
十四五期間城鎮污水處理如何提質增效 瀏覽:915
怎麼測試空氣凈化器的好壞 瀏覽:519
提升泵是幹嘛的 瀏覽:744
布油做蒸餾起沫咋辦 瀏覽:252
廣州工業油煙凈化器一般多少錢 瀏覽:204
喜哆哆空氣凈化器效果怎麼樣 瀏覽:424
油煙凈化器油盒在什麼位置 瀏覽:582