《Windows核心程式設計》 邏輯驅動器操作

2021-09-08 07:17:26 字數 3635 閱讀 2322

windows

中的檔案組織方式採用分層次的結構:計算機中可以安裝有多個物理驅動器,每個物理驅動器可以分為多個主分割槽和擴充套件分割槽,每個主分割槽就是乙個邏輯驅動器,而每個擴充套件分割槽可以劃分為多個邏輯驅動器,邏輯驅動器組成我們熟悉的c盤與d盤等碟符。

對於每個邏輯驅動器,可以給它取乙個標號叫做「卷標」,卷標是當作乙個目錄項存放在邏輯驅動器的根目錄中的。

邏輯驅動器操作:

setvolumelabel

函式用來為乙個驅動器建立、修改以及刪除卷標:

bool winapi setvolumelabel(

__in_opt  lpctstr lprootpathname,

//要設定卷標的邏輯驅動器根目錄,如「c:/」

__in_opt  lpctstr lpvolumename

//指向包含卷標字串的緩衝區

);要檢測系統中當前存在多少個邏輯驅動器可以使用getlogicaldrives函式,函式返回所有可用的碟符:

dword winapi getlogicaldrives(

void

);函式返回乙個32位整數,用其中的每一位代表是否存在乙個邏輯驅動器。由於系統中可用的碟符僅有26個(a:~z:),所以32位已經可以反映出所有的邏輯驅動器,以及它們的碟符分布情況了。返回值的第0位到第25位分別代表驅動器a:~z:是否存在。

函式getlogicaldrivestrings返回字串型別的邏輯驅動器列表:

dword winapi getlogicaldrivestrings(

__in   dword nbufferlength,

//緩衝區大小,如果緩衝區不夠大,後面的資料會被截斷

__out  lptstr lpbuffer

//指向乙個緩衝區,函式在這裡返回

"a:/", 0, "b:/", 0,"c:/", 0, 0

//格式的字串,字串列表以乙個附加的0結束

);函式getdrivetype用來檢測驅動器型別:

uint winapi getdrivetype(

__in_opt  lpctstr lprootpathname

//指向存放有邏輯驅動器根目錄的字串的緩衝區

);函式返回值是邏輯驅動器的型別:

0      

//驅動器型別無法檢測

1      

//指定的根目錄不存在

drive_removable   

//可移動介質,如軟盤

drive_fixed                  

// 固定盤,如硬碟中的邏輯驅動器

drive_remote  

//遠端驅動器,如網路上對映的驅動器

drive_cdrom   

//光碟

drive_ramdisk 

//記憶體虛擬盤

函式getvolumeinformation用來獲得邏輯驅動器的卷標、序列號和檔案系統型別等屬性:

bool winapi getvolumeinformation(

__in_opt   lpctstr lprootpathname,

//指向需要檢測的驅動器根目錄字串,如果要檢測的是網路

//上的驅動器,字串的格式是:「//伺服器名//共享名」

__out      lptstr lpvolumenamebuffer, //

指向返回驅動器的卷標的緩衝區

__in       dword nvolumenamesize,

//上述緩衝區大小

__out_opt  lpdword lpvolumeserialnumber,

//指向返回邏輯驅動器序列號的緩衝區

//序列號是驅動器被格式化時由系統隨機生成的乙個32位數,它儲存於驅動器第乙個扇區

//的引導記錄中

__out_opt  lpdword lpmaximumcomponentlength,

//指向返回最大允許的檔名長度的緩衝區,

//在windows系統中,一般這個數值是255

__out_opt  lpdword lpfilesystemflags,

//返回邏輯驅動器的屬性標記…

__out      lptstr lpfilesystemnamebuffer,

//用於接收檔案系統字串,函式在這裡返回類似於

//fat

、fat32、ntfs型別的字串

__in       dword nfilesystemnamesize

//上述緩衝區大小

);getdiskfreespace

函式用來檢測邏輯驅動器剩餘空間:

bool winapi getdiskfreespace(

__in   lpctstr lprootpathname,

//指向需要檢測的驅動器根目錄字串

__out  lpdword lpsectorspercluster,

//返回每簇扇區數

__out  lpdword lpbytespersector,

//返回每扇區位元組數

__out  lpdword lpnumberoffreeclusters,

//返回驅動器中未使用的簇的數量

__out  lpdword lptotalnumberofclusters

//返回驅動器中簇的總數

);下面的例項**演示了從乙個檔案控制代碼獲得檔案名字,使用到了getlogicaldrivestrings函式:

#include

#include

#include

#include

#include

#include

#define

bufsize 512

bool getfilenamefromhandle(handle hfile)

null,

page_readonly,

0, 1,

null);

if(hfilemap) }}

// go to the next null character.

while

(*p++);

} while

(!bfound && *p);

// end of string}}

bsuccess = true;

unmapviewoffile(pmem);

} closehandle(hfilemap);

}_tprintf(text(

"file name is %s/n"

), pszfilename);

return

(bsuccess);

}int

_tmain(

intargc, tchar *ar**)

hfile = createfile(ar**[1], generic_read, file_share_read, null,

open_existing, 0, null);

if(hfile == invalid_handle_value)

getfilenamefromhandle( hfile );

}

Windows核心程式設計(二)核心驅動執行,除錯

由於windows數字簽名的原因,沒有簽名或者使用測試簽名的都不能放到64位系統上執行。兩個解決辦法。一 將系統設定為除錯模式 二 關閉系統的驅動簽名校驗。服務管理器 管理系統上的所有服務,建立 註冊 修改 啟動服務。所以我們編寫程式的時候,首先要開啟服務管理器。其api為 sc handle wi...

Windows核心程式設計

內容簡介 這是一本經典的windows核心程式設計指南,從第1版到第5版,引領著數十萬程式設計師走入windows開發陣營,培養了大批精英。作為windows開發人員的必備參考,本書是為打算理解windows的c和c 程式設計師精心設計的。第5版全面覆蓋windows xp,windows vist...

WINDOWS核心程式設計 核心物件

今天想把看的第三章的心得寫下來。這章主要介紹了核心物件。在windows中,核心物件是由作業系統來管理,儘管使用者能夠建立它,但是在建立之後,使用者對該核心物件的操作都是委託給作業系統。通常使用者建立和使用的物件分為 使用者物件 如 hicon createicon prama gdi物件函式以及核...