操作系統(tǒng)課設(shè)-虛擬磁盤驅(qū)動(dòng)程序_第1頁(yè)
操作系統(tǒng)課設(shè)-虛擬磁盤驅(qū)動(dòng)程序_第2頁(yè)
操作系統(tǒng)課設(shè)-虛擬磁盤驅(qū)動(dòng)程序_第3頁(yè)
操作系統(tǒng)課設(shè)-虛擬磁盤驅(qū)動(dòng)程序_第4頁(yè)
操作系統(tǒng)課設(shè)-虛擬磁盤驅(qū)動(dòng)程序_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 H a r b i n I n s t i t u t e o f T e c h n o l o g y a t W e i h a i 操作系統(tǒng)課程設(shè)計(jì)報(bào)告設(shè)計(jì)題目:院 系:班 級(jí):學(xué) 號(hào):設(shè) 計(jì) 者:哈爾濱工業(yè)大學(xué)(威海)2008年12月哈爾濱工業(yè)大學(xué)(威海)計(jì)算機(jī)學(xué)院操作系統(tǒng)課程設(shè)計(jì)驗(yàn)收及成績(jī)?cè)u(píng)定表(項(xiàng)目組) 哈爾濱工業(yè)大學(xué)(威海)課程設(shè)計(jì)任務(wù)書 目錄1. 設(shè)計(jì)要求 . . - 4 -2. 設(shè)計(jì)目的 . . - 4 -3. 設(shè)計(jì)的描述 . - 4 -4. 設(shè)計(jì)分析 . . - 5 -4.1驅(qū)動(dòng)程序 . - 5 -4.2 filedisk應(yīng)用程序. - 7 -5. 程序設(shè)計(jì)流程圖 .

2、- 8 -6. 程序主要模塊代碼 . . - 9 -6.1虛擬磁盤或光驅(qū)的加載模塊 . - 9 -6.2虛擬磁盤或光驅(qū)的卸載模塊 . - 11 -7. 調(diào)試分析 . . - 13 -8. 運(yùn)行結(jié)果 . . - 14 -8.1創(chuàng)建虛擬磁盤 . - 14 -8.2創(chuàng)建虛擬光盤 . - 14 -9. 心得體會(huì) . . - 15 -1. 設(shè)計(jì)要求本實(shí)驗(yàn)將在Windows XP平臺(tái)上,指導(dǎo)學(xué)生分析一個(gè)具體的虛擬磁盤的文件系統(tǒng)驅(qū)動(dòng)程序,并完成對(duì)它的完善。具體要求如下:1)、理解文件系統(tǒng)驅(qū)動(dòng)程序(FSD )在系統(tǒng)中的作用和工作機(jī)制。2)、分析實(shí)驗(yàn)給出的虛擬磁盤文件系統(tǒng)設(shè)備驅(qū)動(dòng)程序,能夠掌握其結(jié)構(gòu)和運(yùn)作機(jī)制,

3、同時(shí)理解其與FSD 的關(guān)系。3)、完善所給虛擬設(shè)備文件系統(tǒng)驅(qū)動(dòng)程序,加入虛擬光驅(qū)功能的支持。4)、將虛擬設(shè)備驅(qū)動(dòng)程序安裝到系統(tǒng)中,運(yùn)行相應(yīng)的應(yīng)用程序進(jìn)行測(cè)試分析。2. 設(shè)計(jì)目的了解文件系統(tǒng)及文件系統(tǒng)驅(qū)動(dòng)程序的一般原理。學(xué)習(xí)開發(fā)文件系統(tǒng)驅(qū)動(dòng)程序的開發(fā)環(huán)境,了解其與DDK (Device Drivers Kit,設(shè)備驅(qū)動(dòng)程序開發(fā)包)的關(guān)系。掌握虛擬磁盤技術(shù),能夠編譯生成相應(yīng)的驅(qū)動(dòng)程序并在系統(tǒng)中安裝實(shí)現(xiàn)。進(jìn)一步掌握Windows 2000/XP系統(tǒng)中驅(qū)動(dòng)程序的一般結(jié)構(gòu)。3. 設(shè)計(jì)的描述通常情況下是在磁盤上建立文件系統(tǒng)即硬盤分區(qū),文件系統(tǒng)驅(qū)動(dòng)程序(FSD )已經(jīng)實(shí)現(xiàn)了在硬盤上創(chuàng)建和管理文件,本系統(tǒng)主要

4、實(shí)現(xiàn)將一個(gè)文件虛擬成一個(gè)相應(yīng)的磁盤。在文件系統(tǒng)驅(qū)動(dòng)程序的基礎(chǔ)之上,實(shí)現(xiàn)基于虛擬設(shè)備的文件系統(tǒng),這種虛擬磁盤技術(shù)得到了很多應(yīng)用,例如虛擬光驅(qū)就是其中之一。虛擬磁盤文件系統(tǒng)經(jīng)過(guò)安裝可以模擬真實(shí)的硬盤,支持各種文件系統(tǒng)功能,例如讀寫“磁盤”上的文件。程序?qū)哟畏植既缦拢?4. 設(shè)計(jì)分析4.1驅(qū)動(dòng)程序系統(tǒng)啟動(dòng)時(shí)驅(qū)動(dòng)程序?qū)⑷肟诤瘮?shù)DriverEntry 裝入內(nèi)存,隨即調(diào)用它的入口函數(shù)進(jìn)行初始化。在初始化的過(guò)程中,本驅(qū)動(dòng)程序要完成兩件事:調(diào)用輔助函數(shù)FileDiskCreateDevice 創(chuàng)建幾個(gè)虛擬磁盤的對(duì)象,向I/O管理器注冊(cè)本程序的分發(fā)例程,同時(shí)也注冊(cè)本驅(qū)動(dòng)程序的卸載例程用于在卸載驅(qū)動(dòng)程序時(shí)卸載所占

5、有的資源。創(chuàng)建磁盤設(shè)備對(duì)象的同時(shí)創(chuàng)建一個(gè)設(shè)備工作線程,用于完成IRP 的后續(xù)處理。實(shí)驗(yàn)中利用該線程的一個(gè)事件對(duì)象,實(shí)現(xiàn)對(duì)虛擬磁盤的讀寫同步。本系統(tǒng)就是在該線程中利用一個(gè)時(shí)間對(duì)象,實(shí)現(xiàn)對(duì)虛擬磁盤的讀寫等操作之間的同步,實(shí)際上該工作線程執(zhí)行的是函數(shù)FileDiskThread 。 以下是驅(qū)動(dòng)程序內(nèi)部函數(shù)調(diào)用關(guān)系: (1)全局變量dir_handle HANDLE dir_handle; 該全局變量用于指向一個(gè)“目錄對(duì)象”,存放本驅(qū)動(dòng)程序創(chuàng)建的所有磁盤對(duì)象。(2)模擬磁盤文件信息結(jié)構(gòu) OPEN_FILE_INFORMATIONtypedef struct _OPEN_FILE_INFORMATION

6、DEVICE_TYPE DeviceType;/所模擬的磁盤的類型BOOLEAN ReadOnly; /是否設(shè)置虛擬磁盤為只讀 LARGE_INTEGER FileSize; /本文件的大小 USHORT FileNameLength;/文件名的長(zhǎng)度 UCHAR FileName1; /文件名字符串OPEN_FILE_INFORMATION; 該結(jié)構(gòu)保存了用于虛擬磁盤的文件的詳細(xì)信息。在應(yīng)用程序中利用mount 命令指定這個(gè)文件時(shí),會(huì)將文件的信息組成這樣一個(gè)結(jié)構(gòu)后作為參數(shù)傳入內(nèi)核。驅(qū)動(dòng)程序會(huì)抽取這些信息,并把它們作為虛擬磁盤的磁盤信息,例如磁盤的大小和只讀屬性。 (3)設(shè)備擴(kuò)展結(jié)構(gòu) DEVIC

7、E_EXTENSION自定義的磁盤信息結(jié)構(gòu),用來(lái)保存設(shè)備的細(xì)節(jié)以及對(duì)設(shè)備的編程方式。typedef struct _DEVICE_EXTENSION BOOLEAN media_in_device; HANDLE file_handle;/文件句柄 ANSI_STRING file_name;/文件名 LARGE_INTEGER file_size;/文件的大小 BOOLEAN read_only;/只讀屬性 PSECURITY_CLIENT_CONTEXT security_client_context; LIST_ENTRY list_head; KSPIN_LOCK list_lock;

8、 KEVENT request_event; PVOID thread_pointer; BOOLEAN terminate_thread; DEVICE_EXTENSION, *PDEVICE_EXTENSION;本驅(qū)動(dòng)程序所創(chuàng)建的虛擬磁盤對(duì)象均為自己維護(hù)這樣一個(gè)數(shù)據(jù)結(jié)構(gòu)。實(shí)際上,所有內(nèi)核驅(qū)動(dòng)程序中的設(shè)備對(duì)象都維護(hù)著這樣一個(gè)數(shù)據(jù)結(jié)構(gòu)。其主要作用就是在此保存對(duì)應(yīng)設(shè)備的一些參數(shù),使得所有有關(guān)此設(shè)備的處理都可以通過(guò)設(shè)備對(duì)象訪問(wèn)到這些信息。程序中還引用了ntfs.h 和ntddk.h 中的其它數(shù)據(jù)結(jié)構(gòu)。(1)入口函數(shù) DirverEntryDirverEntry(IN PDRIVER_OBJECT

9、DriverObject, IN PUNICODE_STRING RegisterPath該函數(shù)主要實(shí)現(xiàn)建立相應(yīng)個(gè)數(shù)的磁盤對(duì)象和向I/O管理器注冊(cè)4個(gè)分發(fā)例程以處理來(lái)自應(yīng)用程序的相應(yīng)請(qǐng)求。(2)分發(fā)例程 FileDiskCreateClose FileDiskCreateClose ( IN PDEVICE_OBJECT DriverObject, IN PIRP Irp )在這個(gè)函數(shù)中相應(yīng)打開文件和關(guān)閉文件對(duì)象的請(qǐng)求,對(duì)應(yīng)主功能代碼IRP_MJ_CREATE和IRP_MJ_CLOSE。在本函數(shù)中就是簡(jiǎn)單的返回打開成功的標(biāo)記,不需要完成額外的工作。(3)分發(fā)例程 FileDiskReadWri

10、te FileDiskReadWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp這個(gè)函數(shù)完成對(duì)虛擬磁盤的讀寫,對(duì)應(yīng)于主功能代碼IRP_MJ_WRITE和IRP_MJ_READ。在進(jìn)行讀寫之前要先確認(rèn)設(shè)備是否存在。 (4)分發(fā)例程 FileDiskDeviceControl FileDiskDeviceControl (IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp 該函數(shù)處理發(fā)送到虛擬磁盤的控制信息。 (5)分發(fā)例程 FileDiskUnload FileDiskUnload (IN PDRIVER_OBJE

11、CT DriverObject )用于卸載驅(qū)動(dòng)程序。通過(guò)調(diào)用輔助函數(shù)FileDiskDeleteDevice 卸載本驅(qū)動(dòng)程序創(chuàng)建的各設(shè)備對(duì)象和對(duì)應(yīng)的設(shè)備對(duì)象工作線程。 (6)輔助函數(shù)輔助函數(shù)有 FileDiskCreateDevice、FileDiskThread 、FileDiskDeleteDevice 、FileDiskOpenFile 和FileDiskCloseFile 這些輔助函數(shù)被前面的各個(gè)函數(shù)調(diào)用,以完成相應(yīng)的任務(wù),其中最后兩個(gè)函數(shù)在FileDiskThread 中進(jìn)行調(diào)用,完成相應(yīng)的工作。4.2 filedisk應(yīng)用程序filedisk 應(yīng)用程序用于為驅(qū)動(dòng)程序加載時(shí)創(chuàng)建的幾個(gè)

12、設(shè)備對(duì)象指定一個(gè)卷名,這個(gè)卷名就是對(duì)應(yīng)于該設(shè)備的Win32設(shè)備名稱;同時(shí)為該設(shè)備對(duì)象指定用于作為虛擬磁盤的文件和設(shè)定該磁盤的一些屬性。這些信息都來(lái)源于命令行參數(shù),在解析命令行參數(shù)時(shí)將它們組織到如下一些變量中以供隨后的函數(shù)進(jìn)行處理:int DeviceNumber;/設(shè)備號(hào)char FileName; /虛擬磁盤文件的文件名 int FileSize; /文件大小char DriveLetter; /要指定的設(shè)備對(duì)象的卷標(biāo)BOOLEAN ReadOnly; /指定磁盤為只讀的標(biāo)記BOOLEAN CdImage; /是否將磁盤設(shè)備對(duì)象類型設(shè)置為光驅(qū) POPEN_FILE_INFORMATION O

13、penFileInformation;/存儲(chǔ)模擬文件信息應(yīng)用程序由6個(gè)函數(shù)組成。主函數(shù)main 完成命令行參數(shù)的解析,并根據(jù)參數(shù)的具體情況調(diào)用不同的4個(gè)功能單元模塊:FileDiskSyntax ,F(xiàn)ileDiskMount,FileDiskUmount 和FileDiskStatus 。一旦在四個(gè)單元模塊的執(zhí)行過(guò)程中遇到了錯(cuò)誤或異常,則調(diào)用一個(gè)公共的錯(cuò)處理模塊。應(yīng)用程序結(jié)構(gòu)示意圖: 5. 程序設(shè)計(jì)流程圖 6. 程序主要模塊代碼6.1虛擬磁盤或光驅(qū)的加載模塊int FileDiskMount(int DeviceNumber, / 設(shè)備號(hào) 0 1 2 3 等POPEN_FILE_INFORMA

14、TION OpenFileInformation,/ 文件類型的信息 char DriveLetter, / 文件(卷 名 BOOLEAN CdImage/ 是否是cdrom char VolumeName = ". :" char DeviceName255; / 用來(lái)臨時(shí)存儲(chǔ)文件名字 HANDLE Device;/ 用來(lái)保存返回的文件句柄 DWORD BytesReturned;/ 緩沖區(qū)VolumeName4 = DriveLetter;/卷的名字Device = CreateFile(/創(chuàng)建文件, 并設(shè)置文件的讀寫屬性等VolumeName,GENERIC_READ

15、 | GENERIC_WRITE,/文件訪問(wèn)權(quán)限FILE_SHARE_READ | FILE_SHARE_WRITE, /文件分享權(quán)限NULL, /返回文件指針是否可以被繼承 OPEN_EXISTING,/文件不存在就返回錯(cuò)誤 FILE_FLAG_NO_BUFFERING,/不是用系統(tǒng)的緩存空間NULL ; / 如果要?jiǎng)?chuàng)建的卷標(biāo)正在使用 / 則拋出忙的信息/ 如果K:已分配 而傳入的參數(shù)中使用了K: 這個(gè)卷標(biāo)/ 則返回錯(cuò)誤 K:請(qǐng)求的資源正在使用中if (Device != INVALID_HANDLE_VALUE /創(chuàng)建文件不成功時(shí)處理 SetLastError(ERROR_BUSY; /設(shè)

16、置文件系統(tǒng)忙的信息 PrintLastError(&VolumeName4;/設(shè)置卷標(biāo) return -1;/返回錯(cuò)誤if (CdImage/如果是要?jiǎng)?chuàng)建cdrom 的虛擬文件格式sprintf(DeviceName, DEVICE_NAME_PREFIX "Cd" "%u", DeviceNumber; elsesprintf(DeviceName, DEVICE_NAME_PREFIX "%u", DeviceNumber;/將指定的Win32設(shè)備名(卷標(biāo))和相應(yīng)的NT 設(shè)備名之間建立符號(hào)鏈接 /Win32設(shè)備名(卷標(biāo))只

17、能在用戶程序中使用,NT 設(shè)備名系統(tǒng)運(yùn)行時(shí)使用 /如果錯(cuò)誤, 設(shè)置錯(cuò)誤信息, 并返回if (!DefineDosDevice( DDD_RAW_TARGET_PATH, /傳入的(絕對(duì) 路徑&VolumeName4,/卷標(biāo)的名字 如C: D: 等 DeviceName/設(shè)備的名字 PrintLastError(&VolumeName4;return -1;/-/ 測(cè)試是否創(chuàng)建成功/ 上面已經(jīng)創(chuàng)建了這個(gè)文件(卷/ 如果再次創(chuàng)建, 如果上面創(chuàng)建的已經(jīng)成功 / 則這次創(chuàng)建將返回一個(gè)無(wú)效的句柄, 因?yàn)橄鄳?yīng)的文件(卷 名被占用了Device = CreateFile(VolumeName

18、,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL;/ 如果Device 返回一個(gè)有效的句柄 , 這說(shuō)明上次創(chuàng)建的沒有成功, 這返回錯(cuò)誤信息 / 并將建立的符號(hào)鏈接斷開if (Device = INVALID_HANDLE_VALUEPrintLastError(&VolumeName4;DefineDosDevice(DDD_REMOVE_DEFINITION, &VolumeName4, NULL;ret

19、urn -1;/-/IO設(shè)配操作-打開文件(卷if (!DeviceIoControl(Device,IOCTL_FILE_DISK_OPEN_FILE,OpenFileInformation,sizeof(OPEN_FILE_INFORMATION + OpenFileInformation->FileNameLength - 1, NULL,0,&BytesReturned,NULL/打開不成功則顯示錯(cuò)誤信息, 并將建立的符號(hào)鏈接斷開PrintLastError("FileDisk:"DefineDosDevice(DDD_REMOVE_DEFINITIO

20、N, &VolumeName4, NULL;return -1;return 0;6.2虛擬磁盤或光驅(qū)的卸載模塊int FileDiskUmount(char DriveLetterchar VolumeName = ". :"HANDLE Device;DWORD BytesReturned;VolumeName4 = DriveLetter;Device = CreateFile(/此時(shí)所指的虛擬設(shè)備時(shí)候存在 VolumeName,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NU

21、LL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL;/ 測(cè)試的結(jié)構(gòu)有兩種:/1.返回一個(gè)有效的文件句柄/ 說(shuō)明要卸載的設(shè)備存在/2.返回一個(gè)無(wú)效的文件句柄/ 說(shuō)明要卸載的文件系統(tǒng)根本不存在/ 強(qiáng)行卸載會(huì)出現(xiàn)錯(cuò)誤, 此時(shí)要拋出錯(cuò)誤信息if (Device = INVALID_HANDLE_VALUE/IO設(shè)配操作-鎖定此文件(卷if (!DeviceIoControl(Device,FSCTL_LOCK_VOLUME, /文件系統(tǒng)命令-關(guān)閉文件(卷NULL,0,NULL,0,&BytesReturned,NULLPrintLastError(&VolumeName4;/不成功就打印錯(cuò)誤后返回return -1;/IO設(shè)配操作-關(guān)閉文件if (!DeviceIoControl(Device,IOCTL_FILE_DISK_CLOSE_FILE,/IO的控制信息 關(guān)閉磁盤文件 NULL,0,NULL,0,&BytesReturned,NULLPrintLastError("FileDisk:"/不成功就打印錯(cuò)誤后

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論