資源簡介
filedisk 源碼 分析 分為核心層和應用層兩個部分,特別的詳細,有助于對虛擬磁盤的深入研究。

代碼片段和文件信息
///////////////////////////////////////////////////////
//該版本的ARG?PARSER部分存在問題
//在帶有5個參數,但是缺少文件名的狀況沒有辦法進行解析
//BUG一個
////////////////////////////////////////////////////////
#include?
#include?
#include?
#include?“filedisk.h“
int?Syntax(void)
{
????fprintf(stderr?“syntax:\n“);
????fprintf(stderr?“filedisk?/mount??devicenumber?filename?[size[k|M|G]?|?/ro?|?/cd]?driveletter\n“);
????fprintf(stderr?“filedisk?/umount?driveletter\n“);
????fprintf(stderr?“\n“);
????fprintf(stderr?“example:\n“);
????fprintf(stderr?“filedisk?/mount??0?c:\\temp\\filedisk.img?8M?f:\n“);
????fprintf(stderr?“filedisk?/mount??1?c:\\temp\\cdimage.iso?/cd?i:\n“);
????fprintf(stderr?“filedisk?/umount?f:\n“);
????fprintf(stderr?“filedisk?/umount?i:\n“);
????return?-1;
}
void?PrintLastError(char*?Prefix)
{
????LPVOID?lpMsgBuf;
????FormatMessage(?
????????FORMAT_MESSAGE_ALLOCATE_BUFFER?|
????????FORMAT_MESSAGE_FROM_SYSTEM?|
????????FORMAT_MESSAGE_IGNORE_INSERTS
????????NULL
????????GetLastError()
????????0
????????(LPTSTR)?&lpMsgBuf
????????0
????????NULL
????????);
????fprintf(stderr?“%s?%s“?Prefix?(LPTSTR)?lpMsgBuf);
????LocalFree(lpMsgBuf);
}
int
Mount(
????int?????????????????????DeviceNumber
????POPEN_FILE_INFORMATION??OpenFileInformation
????char????????????????????DriveLetter
)
{
????char????VolumeName[]?=?“\\\\.\\?:“;
????char????DeviceName[255];
????HANDLE??Device;
????DWORD???BytesReturned;
????VolumeName[4]?=?DriveLetter;?//處理結果類似“\\\\.\\D:“
////////////////////////////////////////////////////////////////
//測試該虛擬卷是否已經存在,
//如果已經存在
//則輸出錯誤
////////////////////////////////////////////////////////////////
????Device?=?CreateFile(
????????VolumeName
????????GENERIC_READ?|?GENERIC_WRITE
????????FILE_SHARE_READ?|?FILE_SHARE_WRITE
????????NULL
????????OPEN_EXISTING
????????FILE_FLAG_NO_BUFFERING
????????NULL
????????);
????if?(Device?!=?INVALID_HANDLE_VALUE) //這里判斷的是合法的情況
????{
????????SetLastError(ERROR_BUSY);
????????PrintLastError(&VolumeName[4]);
????????return?-1;
????}
////////////////////////////////////////////////////////////////
//如果不存在
//則開始建立虛擬盤符
//DEVICE_NAME_PREFIX=“\Device\FileDisk\FileDisk”
////////////////////////////////////////////////////////////////
????
sprintf(DeviceName?DEVICE_NAME_PREFIX?“%u“?DeviceNumber);
????////////////////////////////////////////////////////////////////
//所有到VolumeName的IO請求都將被重定向到DeviceName
//執行到這里,在系統中應該可以看見一個虛擬的盤符出現
//但是還不能對該盤符做任何操作
////////////////////////////////////////////////////////////////
if?(!DefineDosDevice(
????????DDD_RAW_TARGET_PATH
????????&VolumeName[4]
????????DeviceName
????????))
????{
????????PrintLastError(&VolumeName[4]);
????????return?-1;
????}
????
////////////////////////////////////////////////////////////////
//打開虛擬盤符
//如果打開設備成功,則向其發送IOCTL_FILE_DISK_OPEN_FILE?IRP
//其中IOCTL_FILE_DISK_OPEN_FILE在filedisk
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????356??2002-08-08?14:14??ccdeath-filedisk\filedisk.reg
?????文件??????10556??2004-06-09?08:14??ccdeath-filedisk\filedisk.sys
?????文件??????24455??2009-08-21?20:24??ccdeath-filedisk\filedisk應用層\Debug\filedisk.obj
?????文件?????176263??2009-08-21?20:24??ccdeath-filedisk\filedisk應用層\Debug\filedisk應用層.exe
?????文件?????185200??2009-08-21?20:24??ccdeath-filedisk\filedisk應用層\Debug\filedisk應用層.ilk
????I.A....???3715948??2009-08-21?20:24??ccdeath-filedisk\filedisk應用層\Debug\filedisk應用層.pch
?????文件?????361472??2009-08-21?20:24??ccdeath-filedisk\filedisk應用層\Debug\filedisk應用層.pdb
?????文件??????41984??2009-08-21?20:24??ccdeath-filedisk\filedisk應用層\Debug\vc60.idb
?????文件??????69632??2009-08-21?20:24??ccdeath-filedisk\filedisk應用層\Debug\vc60.pdb
?????文件??????10574??2007-12-26?10:15??ccdeath-filedisk\filedisk應用層\filedisk.c
?????文件???????1057??2007-12-26?10:20??ccdeath-filedisk\filedisk應用層\filedisk.h
?????文件???????4435??2007-12-26?08:50??ccdeath-filedisk\filedisk應用層\filedisk應用層.dsp
?????文件????????553??2009-08-21?20:19??ccdeath-filedisk\filedisk應用層\filedisk應用層.dsw
?????文件??????50176??2009-08-21?20:57??ccdeath-filedisk\filedisk應用層\filedisk應用層.ncb
?????文件??????48640??2009-08-21?20:57??ccdeath-filedisk\filedisk應用層\filedisk應用層.opt
?????文件???????1386??2009-08-21?20:24??ccdeath-filedisk\filedisk應用層\filedisk應用層.plg
????.......??????1760??2007-12-26?08:45??ccdeath-filedisk\filedisk核心層\buildchk.log
?????文件??????42187??2009-08-22?22:32??ccdeath-filedisk\filedisk核心層\filedisk.c
?????文件???????1158??2007-12-26?09:45??ccdeath-filedisk\filedisk核心層\filedisk.h
?????文件???????4069??2007-12-26?08:40??ccdeath-filedisk\filedisk核心層\filedisk核心層.dsp
?????文件????????757??2007-12-26?08:53??ccdeath-filedisk\filedisk核心層\filedisk核心層.dsw
?????文件??????66560??2009-08-20?23:58??ccdeath-filedisk\filedisk核心層\filedisk核心層.ncb
?????文件??????53760??2009-08-20?23:58??ccdeath-filedisk\filedisk核心層\filedisk核心層.opt
?????文件???????1296??2007-12-26?08:39??ccdeath-filedisk\filedisk核心層\filedisk核心層.plg
?????文件????????267??2006-11-03?20:33??ccdeath-filedisk\filedisk核心層\MAKEFILE
?????文件?????????91??2007-12-26?08:44??ccdeath-filedisk\filedisk核心層\Sources
?????文件????????307??2002-08-08?14:25??ccdeath-filedisk\install.txt
?????文件????????179??2007-12-26?13:24??ccdeath-filedisk\閱讀之前說明.txt
?????目錄??????????0??2009-08-21?20:24??ccdeath-filedisk\filedisk應用層\Debug
?????目錄??????????0??2009-08-20?23:57??ccdeath-filedisk\filedisk核心層\Debug
............此處省略6個文件信息
- 上一篇:最優化方法課件 最優化理論與方法
- 下一篇:RT-thread-0.3.1
評論
共有 條評論