專利名稱:在視窗操作系統(tǒng)上獲取bios版本日期的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,特別是指借助動(dòng)態(tài)虛擬設(shè)備驅(qū)動(dòng)程序(dynamic virtual device driver;dynamic VxD)實(shí)現(xiàn)在視窗操作系統(tǒng)上獲取BIOS版本日期的方法。
由于計(jì)算機(jī)硬件技術(shù)不斷翻新,BIOS也不斷地被計(jì)算機(jī)廠商升級(jí)換代,由于不同的BIOS支持的硬件及服務(wù)皆不同,因此,獲得BIOS版本日期對(duì)編寫對(duì)硬件進(jìn)行檢測(cè)的軟件具有極其重要的意義。
在傳統(tǒng)DOS操作系統(tǒng)上,BIOS版本日期可以通過(guò)讀取固定的BIOS存儲(chǔ)器而獲得,但是,視窗操作系統(tǒng)上不允許應(yīng)用程序直接存取實(shí)際存儲(chǔ)器,因此,想在視窗操作系統(tǒng)上獲得BIOS版本日期也就遇到實(shí)際上的困難。
本發(fā)明所揭示的在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,是借助于動(dòng)態(tài)虛擬設(shè)備驅(qū)動(dòng)程序(dynamic virtual device driver;dynamic VxD)實(shí)現(xiàn)在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,利用VxD能執(zhí)行于RING 0特權(quán)級(jí),并定義輸入?yún)?shù)與輸出參數(shù)的結(jié)構(gòu),獲取BIOS的System BIOS版本日期與Video BIOS版本日期。
以在一筆記型計(jì)算機(jī)測(cè)試程序Evolution的系統(tǒng)信息顯示(SystemInformation)為例,需要顯示BIOS的System BIOS版本日期與VideoBIOS版本日期。經(jīng)加載BIOSDATE.VxD後,定義輸入?yún)?shù)的結(jié)構(gòu)中StartAddress為0xffff0,PrepareSize為0x400(1K),使用VxD中的READDATE功能,返回值結(jié)構(gòu)中CatchedValue內(nèi)的值即希望獲得的System BIOS版本日期。
定義輸入?yún)?shù)的結(jié)構(gòu)中,StartAddress為0xc0000,PrepareSize為0x400,再使用VxD中的READDATE功能,返回值結(jié)構(gòu)中CatchedValue內(nèi)的值即希望獲得的Video BIOS版本日期。
有關(guān)本發(fā)明的詳細(xì)內(nèi)容及技術(shù)特征,將結(jié)合
如下圖1~3為本發(fā)明在視窗操作系統(tǒng)上獲取BIOS版本日期具體實(shí)現(xiàn)的流程圖。
步驟101 獲取搜索的起始地址步驟102獲取搜索的區(qū)域大小步驟103是否存在該物理地址步驟104設(shè)置錯(cuò)誤標(biāo)志步驟105返回0到9位的值給應(yīng)用程序步驟106將物理地址映射至線性地址步驟107初始化地址偏移量I步驟108偏移量I是否小于存儲(chǔ)器大小減去8步驟109以起始地址加上偏移量I所指向的地址是否為數(shù)字步驟110偏移量I加1步驟201以起始地址加上偏移量I所指向的地址為基址,其第2位與第5位是否為符號(hào)″/″步驟202以起始地址加上偏移量I所指向的地址為基址,其第0位至第7位是否為符號(hào)″/″或數(shù)字步驟203以起始地址加上偏移量I所指向的地址為基址,其第8位與第9位是否為數(shù)字步驟204保存0到9位的值步驟205保存0到7位的值步驟206設(shè)第8與第9位為空格步驟301以起始地址加上偏移量I所指向的地址為基址,其第4位與第7位是否為符號(hào)″/″步驟302以起始地址加上偏移量I所指向的地址為基址,其第0位至第9位是否為符號(hào)″/″或數(shù)字本發(fā)明主要的目的在于借助于動(dòng)態(tài)虛擬設(shè)備驅(qū)動(dòng)程序(dynamicvirtual device driver;dynamic VxD)實(shí)現(xiàn)在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,使程序員在編寫視窗應(yīng)用程序時(shí)能夠輕松地獲得BIOS版本日期的方法。
就Intel的x86系列處理器而言,在保護(hù)模式下共有四個(gè)特權(quán)級(jí)(Rings Privilege,如RING 0、RING 1、RING 2及RING 3),不同RINGS提供不同形式的保護(hù)與不同級(jí)別的特權(quán),其分別代表了對(duì)儲(chǔ)存設(shè)備的不同權(quán)限。而RING x是指操作系統(tǒng)的結(jié)構(gòu)像一圈圈的同心圓,最內(nèi)部是核心(kernel)部分,稱RING 0,而愈外面的RING是愈接近用戶層(user level),而RING x是x86架構(gòu)的設(shè)計(jì),不是指操作系統(tǒng),大多數(shù)的CPU都只分特權(quán)模式和一般模式,而x86則分成RING 0-RING 3四個(gè)模式,但一般操作系統(tǒng)為了跨平臺(tái)考慮,也僅用RING 0和RING 3,RING 1和RING 2就如x86保護(hù)模式(protected mode),雖然有,但很少人使用。
所以,視窗操作系統(tǒng)使用兩個(gè)級(jí)別操作系統(tǒng)執(zhí)行于RING 0及應(yīng)用程序執(zhí)行于RING 3,且只有RING 0的程序才有權(quán)限對(duì)BIOS存儲(chǔ)器進(jìn)行直接I/O操作,視窗操作系統(tǒng)不支持應(yīng)用程序?qū)τ布闹苯覫/O操作,但在視窗操作系統(tǒng)中有一類特殊的程序,即虛擬設(shè)備驅(qū)動(dòng)程序(virtual device driver;VxD),此VxD能執(zhí)行于RING 0特權(quán)級(jí),可執(zhí)行一切操作系統(tǒng)的工作,視窗操作系統(tǒng)設(shè)計(jì)VxD的目的是為了提供一種在不通過(guò)應(yīng)用程序,而能共享同一種外部設(shè)備的機(jī)制,也就是,可利用自己的VxD取代系統(tǒng)所提供的VxD,如此即能讀取BIOS存儲(chǔ)器的控制權(quán),使視窗應(yīng)用程序能夠從實(shí)際存儲(chǔ)器中獲得BIOS版本日期。
VxD與視窗應(yīng)用程序之間的信息交流主要依據(jù)應(yīng)用程序接口(API)的DeviceIoControl函數(shù),在此函數(shù)的參數(shù)中包含一個(gè)指向輸入緩沖區(qū)的指針,以及一個(gè)指向輸出緩沖區(qū)的指針,而通過(guò)兩個(gè)緩沖區(qū),可以把需要的參數(shù)遞交給VxD,并且把結(jié)果返回給應(yīng)用程序,當(dāng)然,在使用此DeviceIoControl函數(shù)之前,需要加載(reloaded)相應(yīng)的VxD,并在服務(wù)完後再卸載(unloaded)此VxD。
一般而言,BIOS版本日期被放在BIOS存儲(chǔ)器的固定位置上,也即被保存在物理地址(physical address)0xffff4開始的8個(gè)或10個(gè)字節(jié)的空間內(nèi),由于物理地址是指在計(jì)算機(jī)存儲(chǔ)器當(dāng)中真正的存儲(chǔ)器地址。若計(jì)算機(jī)系統(tǒng)采用物理地址,將會(huì)使系統(tǒng)程序的設(shè)計(jì)變得較容易,因?yàn)槊恳粋€(gè)物理地址都是以線性(linear)的方式表示出來(lái),這種表示方式是唯一的,但是在虛擬存儲(chǔ)器系統(tǒng)中,因?yàn)榭梢岳糜脖P的空間來(lái)當(dāng)成存儲(chǔ)器的一部份,所以所有的存儲(chǔ)器便不可能全部都是物理地址。
BIOS存儲(chǔ)器的時(shí)間格式一般很固定,月、日、年之間用符號(hào)″/″隔開,具體的有以下幾種形式1.月/日/年型,包括xx/xx/xx與xx/xx/xxxx(x為0-9的數(shù)字);2.年/月/日型,包括xx/xx/xx與xxxx/xx/xx(x為0-9的數(shù)字),由于時(shí)間格式比較特殊,只要在實(shí)際存儲(chǔ)器中搜索到xx/xx/xx或xxxx/xx/xx的內(nèi)容,即可確定此為一時(shí)間。而在特殊BIOS存儲(chǔ)器區(qū)的地址0xffff0開始向下尋找,找到第一個(gè)時(shí)間值即為所要找的BIOS版本日期;同理,從0xc0000開始向下尋找,找到第一個(gè)時(shí)間值即為VIDEO BIOS版本日期。
第1~3圖為本發(fā)明在視窗操作系統(tǒng)上獲取BIOS版本日期具體實(shí)現(xiàn)的流程圖,在VxD內(nèi)獲取BIOS版本日期前,須定義輸入?yún)?shù)與輸出參數(shù)的結(jié)構(gòu)1.定義輸入?yún)?shù)為了使VxD存取BIOS存儲(chǔ)器的功能具有通用性,至少需要兩個(gè)參數(shù),其一為所搜索的該存儲(chǔ)區(qū)的起始地址,如搜索BIOS版本日期的0xffff0與搜索Video BIOS版本日期的0xc0000;其二為所搜索儲(chǔ)存區(qū)的大小,也即所搜索的時(shí)間可能存在的區(qū)域大小,所以輸入?yún)?shù)的結(jié)構(gòu)定義為<pre listing-type="program-listing"><![CDATA[typedef struct{ DWORD StartAddress; DWORD PrepareSize;}InputBuffer;]]></pre>2.定義輸出參數(shù)依據(jù)輸入的參數(shù),VxD在BIOS存儲(chǔ)器內(nèi)進(jìn)行搜索,找到所求的時(shí)間值,即返回給使用VxD的視窗應(yīng)用程序,因此,應(yīng)定義一個(gè)至少10個(gè)字節(jié)的字符串,用以接收搜索結(jié)果,所以輸出參數(shù)的結(jié)構(gòu)定義為<pre listing-type="program-listing"><![CDATA[typedef struct{ char CatchedValue[10];}OutputBuffer;]]></pre>接著把VxD的輸入?yún)?shù)緩沖區(qū)指針轉(zhuǎn)化成自定義的InputBuffer型指針,從而獲取搜索的起始地址(步驟101),及獲取搜索的區(qū)域大小(步驟102),接著判斷存儲(chǔ)區(qū)塊是否存在該物理地址(步驟103),如果不存在,則設(shè)置錯(cuò)誤標(biāo)志(步驟104),并返回0到9位的值給應(yīng)用程序(步驟105);如果存在,則將物理地址映射至線性地址(步驟106),該線性地址(linear address)所指的是操作系統(tǒng)當(dāng)中,每個(gè)存儲(chǔ)器單元的地址是連續(xù)性,而且獨(dú)一無(wú)二的表示法。
本發(fā)明所提供的方法是運(yùn)用基址加上偏移量的地址來(lái)加以存取存儲(chǔ)器,所以必須初始化地址偏移量I(步驟107),鑒于BIOS版本日期表示的格式,時(shí)間至少需要8個(gè)字節(jié)來(lái)儲(chǔ)存,所以搜索到size-8的位置時(shí),如果該地址所儲(chǔ)存的不是數(shù)字時(shí),即表示剩下的7個(gè)字節(jié)不可能是一個(gè)時(shí)間值,所以最多搜索size-8次,每次分析連續(xù)的8或10個(gè)字節(jié),并判斷偏移量I是否小于存儲(chǔ)器大小減去8(步驟108),如果不是,則設(shè)置錯(cuò)誤標(biāo)志(步驟104),并返回0到9位的值給應(yīng)用程序(步驟105);如果是,則判斷以起始地址加上偏移量I所指向的地址是否為數(shù)字(步驟109),也即判斷其值是否在0x30至0x39之間,如果不是數(shù)字,則將偏移量I加1(步驟110),繼續(xù)執(zhí)行步驟108,如果是數(shù)字,則繼續(xù)執(zhí)行步驟A(請(qǐng)參考第2圖),如下列所述。
依據(jù)本發(fā)明的判斷方法,將時(shí)間格式分成兩類處理,即xx/xx/xx與xx/xx/xxxx為一類,其共同點(diǎn)為第2位與第5位為符號(hào)″/″;xxxx/xx/xx為另一類,其第4位與第7位為符號(hào)″/″。所以,接著以起始地址加上偏移量I所指向的地址為基址,其第2位與第5位是否為符號(hào)″/″(步驟201),如果不是,則轉(zhuǎn)而執(zhí)行步驟D(請(qǐng)參考第3圖),并以起始地址加上偏移量I所指向的地址為基址,其第4位與第7位是否為符號(hào)″/″(步驟301),如果不是,則回到步驟C,如果是,則接著以起始地址加上偏移量I所指向的地址為基址,其第0位至第9位是否為符號(hào)″/″或數(shù)字(步驟302),如果不是,則回到步驟C,如果是,則保存0到9位的值(步驟204),并回到步驟B。
上述步驟201中,如果為是,則以起始地址加上偏移量I所指向的地址為基址,其第0位至第7位是否為符號(hào)″/″或數(shù)字(步驟202),如果不是,則繼續(xù)執(zhí)行步驟C;如果為是,則以起始地址加上偏移量I所指向的地址為基址,其第8位與第9位是否為數(shù)字(步驟203),如果為是,則保存0到9位的值(步驟204),并回到步驟B;如果不是,則保存0到7位的值(步驟205),并設(shè)第8與第9位為空格(步驟206),接著回到步驟B。
經(jīng)上述所揭示的方法,本發(fā)明還以一具體的實(shí)施例說(shuō)明本方法的可行性在一筆記型計(jì)算機(jī)測(cè)試程序Evolution的系統(tǒng)信息顯示(System Information)中,需要顯示BIOS的System BIOS版本日期與Video BIOS版本日期。經(jīng)載入BIOSDATE.VxD后,定義輸入?yún)?shù)的結(jié)構(gòu)中,StartAddress為0xffff0,PrepareSize為0x400(1K),使用VxD中的READDATE功能,返回值結(jié)構(gòu)中CatchedValue內(nèi)的值即希望獲得的System BIOS版本日期。
定義輸入?yún)?shù)的結(jié)構(gòu)中,StartAddress為0xc0000,PrepareSize為0x400,再使用VxD中的READDATE功能,返回值結(jié)構(gòu)中CatchedValue內(nèi)的值即希望獲得的Video BIOS版本日期。
雖然參照較佳實(shí)施例對(duì)本發(fā)明進(jìn)行了描述,然其并非用以限定本發(fā)明,本領(lǐng)域的任何技術(shù)人員在不脫離本發(fā)明之精神和范圍內(nèi),可進(jìn)行適當(dāng)?shù)男薷呐c變動(dòng),因此本發(fā)明的保護(hù)范圍應(yīng)以所附的為準(zhǔn)。
權(quán)利要求
1.一種在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,該方法至少包含下列步驟定義輸入及輸出參數(shù)緩沖區(qū);獲取搜索存儲(chǔ)器的起始地址及區(qū)域大??;將物理地址映射至線性地址;初始化地址偏移量;確定該偏移量小于該存儲(chǔ)器大小減去8;確定以該起始地址加上該偏移量所指向的地址為數(shù)字;以該數(shù)字的該地址為基址,確定其第2位與第5位為符號(hào)″/″;確定該基址的第0位至第7位為符號(hào)″/″或數(shù)字;確定該基址的第8位與第9位為數(shù)字;及保存該基址的0到9位的值,并返回該0到9位的值給應(yīng)用程序。
2.如權(quán)利要求1所述的在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,其特征在于該定義輸入?yún)?shù)還包含所搜索該儲(chǔ)存區(qū)的該起始地址及該區(qū)域大小。
3.如權(quán)利要求1所述的在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,其特征在于該定義輸出參數(shù)還包含定義一個(gè)至少10個(gè)字節(jié)的字符串,用以接收搜索結(jié)果。
4.如權(quán)利要求1所述的在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,其特征在于確定該第2的位與第5位為符號(hào)″/″的步驟是依據(jù)該BIOS版本日期的時(shí)間格式。
5.如權(quán)利要求4所述的在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,其特征在于該時(shí)間格式為xx/xx/xx與xx/xx/xxxx。
6.如權(quán)利要求5所述的在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,其特征在于該x為0-9的數(shù)字。
7.一種在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,該方法至少包含下列步驟定義輸入及輸出參數(shù)緩沖區(qū);獲取搜索存儲(chǔ)器的起始地址及區(qū)域大??;將物理地址映射至線性地址;初始化地址偏移量;確定該偏移量小于該存儲(chǔ)器大小減去8;確定以該起始地址加上該偏移量所指向的地址為數(shù)字;以該數(shù)字的該地址為基址,確定其第4位與第7位為符號(hào)″/″;確定該基址的第0位至第9位為符號(hào)″/″或數(shù)字;確定該基址的第8位與第9位為數(shù)字;及保存該基址的0到9位的值,并返回該0到9位的值給應(yīng)用程序。
8.如權(quán)利要求7所述的在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,其特征在于該定義輸入?yún)?shù)還包含所搜索該儲(chǔ)存區(qū)的該起始地址及該區(qū)域大小。
9.如權(quán)利要求7所述的在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,其特征在于該定義輸出參數(shù)還包含定義一個(gè)至少10個(gè)字節(jié)的字符串,用以接收搜索結(jié)果。
10.如權(quán)利要求7所述的在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,其特征在于確定該第4位與第7位為符號(hào)″/″的步驟是依據(jù)該BIOS版本日期的時(shí)間格式。
11.如權(quán)利要求10所述的在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,其特征在于該時(shí)間格式為xxxx/xx/xx。
12.如權(quán)利要求11所述的在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,其特征在于該x為0-9的數(shù)字。
全文摘要
一種借助動(dòng)態(tài)虛擬設(shè)備驅(qū)動(dòng)程序(dynamic virtual device driver;dynamic VxD)實(shí)現(xiàn)在視窗操作系統(tǒng)上獲取BIOS版本日期的方法,首先定義輸入及輸出參數(shù)緩沖區(qū),并獲取搜索存儲(chǔ)器的起始地址及區(qū)域大小;再將物理地址映射至線性地址;經(jīng)初始化地址偏移量后,確定該偏移量小于該存儲(chǔ)器大小減去8;再確定以該起始地址加上該偏移量所指向的地址為數(shù)字;以該數(shù)字的該地址為基址,確定數(shù)字后;再保存該基址的0到9位的值,并返回該0到9位的值給應(yīng)用程序,獲取BIOS版本日期。
文檔編號(hào)G06F9/445GK1369784SQ01103460
公開日2002年9月18日 申請(qǐng)日期2001年2月13日 優(yōu)先權(quán)日2000年11月7日
發(fā)明者羅江, 陳玄同, 林光信 申請(qǐng)人:英業(yè)達(dá)股份有限公司