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物件函式以及核...