mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2024-12-30 17:26:31 +00:00
1b75d91002
Add arg to SATARep to specify drive types to show. Add checks in AHCIPortInit to verify port signatures, add helper method to get signatures from port.
253 lines
26 KiB
HTML
Executable file
253 lines
26 KiB
HTML
Executable file
<!DOCTYPE HTML>
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html;charset=US-ASCII">
|
|
<meta name="generator" content="ZealOS V0.13">
|
|
<style type="text/css">
|
|
body {background-color:#fef1f0;}
|
|
.cF0{color:#000000;background-color:#fef1f0;}
|
|
.cF1{color:#0148a4;background-color:#fef1f0;}
|
|
.cF2{color:#3b7901;background-color:#fef1f0;}
|
|
.cF3{color:#057c7e;background-color:#fef1f0;}
|
|
.cF4{color:#bb2020;background-color:#fef1f0;}
|
|
.cF5{color:#9e42ae;background-color:#fef1f0;}
|
|
.cF6{color:#b57901;background-color:#fef1f0;}
|
|
.cF7{color:#b2b6af;background-color:#fef1f0;}
|
|
.cF8{color:#555753;background-color:#fef1f0;}
|
|
.cF9{color:#678fbb;background-color:#fef1f0;}
|
|
.cFA{color:#82bc49;background-color:#fef1f0;}
|
|
.cFB{color:#0097a2;background-color:#fef1f0;}
|
|
.cFC{color:#e26a6a;background-color:#fef1f0;}
|
|
.cFD{color:#c671bc;background-color:#fef1f0;}
|
|
.cFE{color:#c7ab00;background-color:#fef1f0;}
|
|
.cFF{color:#fef1f0;background-color:#fef1f0;}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<pre style="font-family:monospace;font-size:12pt">
|
|
<a name="l1"></a><span class=cF1>Bool</span><span class=cF0> </span><span class=cF5>BlkDevLock</span><span class=cF0>(</span><span class=cF9>CBlkDev</span><span class=cF0> *bd)
|
|
<a name="l2"></a>{</span><span class=cF2>//Make this task have exclusive access to BlkDev.</span><span class=cF0>
|
|
<a name="l3"></a> </span><span class=cF5>BlkDevCheck</span><span class=cF0>(bd);
|
|
<a name="l4"></a>
|
|
<a name="l5"></a> </span><span class=cF1>while</span><span class=cF0> (bd->lock_fwding)
|
|
<a name="l6"></a> bd = bd->lock_fwding; </span><span class=cF2>//If two blkdevs on same controller, use just one lock</span><span class=cF0>
|
|
<a name="l7"></a>
|
|
<a name="l8"></a> </span><span class=cF1>if</span><span class=cF0> (!</span><span class=cF5>Bt</span><span class=cF7>(</span><span class=cF0>&bd->locked_flags, </span><span class=cF3>BDlf_LOCKED</span><span class=cF7>)</span><span class=cF0> || bd->owning_task != </span><span class=cF5>Fs</span><span class=cF0>)
|
|
<a name="l9"></a> </span><span class=cF7>{</span><span class=cF0>
|
|
<a name="l10"></a> </span><span class=cF1>while</span><span class=cF0> (</span><span class=cF5>LBts</span><span class=cF7>(</span><span class=cF0>&bd->locked_flags, </span><span class=cF3>BDlf_LOCKED</span><span class=cF7>)</span><span class=cF0>)
|
|
<a name="l11"></a> </span><span class=cF5>Yield</span><span class=cF0>;
|
|
<a name="l12"></a>
|
|
<a name="l13"></a> bd->owning_task = </span><span class=cF5>Fs</span><span class=cF0>;
|
|
<a name="l14"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cF3>TRUE</span><span class=cF0>;
|
|
<a name="l15"></a> </span><span class=cF7>}</span><span class=cF0>
|
|
<a name="l16"></a> </span><span class=cF1>else</span><span class=cF0>
|
|
<a name="l17"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cF3>FALSE</span><span class=cF0>;
|
|
<a name="l18"></a>}
|
|
<a name="l19"></a>
|
|
<a name="l20"></a></span><span class=cF1>Bool</span><span class=cF0> </span><span class=cF5>BlkDevUnlock</span><span class=cF0>(</span><span class=cF9>CBlkDev</span><span class=cF0> *bd, </span><span class=cF1>Bool</span><span class=cF0> reset=</span><span class=cF3>FALSE</span><span class=cF0>)
|
|
<a name="l21"></a>{</span><span class=cF2>//Release exclusive lock on access to BlkDev.</span><span class=cF0>
|
|
<a name="l22"></a> </span><span class=cF5>BlkDevCheck</span><span class=cF0>(bd);
|
|
<a name="l23"></a>
|
|
<a name="l24"></a> </span><span class=cF1>while</span><span class=cF0> (bd->lock_fwding)
|
|
<a name="l25"></a> bd = bd->lock_fwding; </span><span class=cF2>//If two blkdevs on same controller, use just one lock</span><span class=cF0>
|
|
<a name="l26"></a>
|
|
<a name="l27"></a> </span><span class=cF1>if</span><span class=cF0> (</span><span class=cF5>Bt</span><span class=cF7>(</span><span class=cF0>&bd->locked_flags, </span><span class=cF3>BDlf_LOCKED</span><span class=cF7>)</span><span class=cF0> && bd->owning_task == </span><span class=cF5>Fs</span><span class=cF0>)
|
|
<a name="l28"></a> </span><span class=cF7>{</span><span class=cF0>
|
|
<a name="l29"></a> </span><span class=cF1>if</span><span class=cF0> (reset)
|
|
<a name="l30"></a> bd->flags &= ~(</span><span class=cF3>BDF_INITIALIZED</span><span class=cF0> | </span><span class=cF3>BDF_INIT_IN_PROGRESS</span><span class=cF0>);
|
|
<a name="l31"></a> bd->owning_task = </span><span class=cF3>NULL</span><span class=cF0>;
|
|
<a name="l32"></a> </span><span class=cF5>LBtr</span><span class=cF0>(&bd->locked_flags, </span><span class=cF3>BDlf_LOCKED</span><span class=cF0>);
|
|
<a name="l33"></a> </span><span class=cF5>Yield</span><span class=cF0>; </span><span class=cF2>//Prevent deadlock</span><span class=cF0>
|
|
<a name="l34"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cF3>TRUE</span><span class=cF0>;
|
|
<a name="l35"></a> </span><span class=cF7>}</span><span class=cF0>
|
|
<a name="l36"></a> </span><span class=cF1>else</span><span class=cF0>
|
|
<a name="l37"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cF3>FALSE</span><span class=cF0>;
|
|
<a name="l38"></a>}
|
|
<a name="l39"></a>
|
|
<a name="l40"></a></span><span class=cF1>Bool</span><span class=cF0> </span><span class=cFD>BlkDevInit</span><span class=cF0>(</span><span class=cF9>CBlkDev</span><span class=cF0> *bd)
|
|
<a name="l41"></a>{
|
|
<a name="l42"></a> </span><span class=cF9>CDirEntry</span><span class=cF0> de;
|
|
<a name="l43"></a> </span><span class=cF1>U8</span><span class=cF0> buf[</span><span class=cF3>STR_LEN</span><span class=cF0>];
|
|
<a name="l44"></a> </span><span class=cF9>CDrive</span><span class=cF0> *drive = </span><span class=cF5>Letter2Drive</span><span class=cF0>(bd->first_drive_let);
|
|
<a name="l45"></a> </span><span class=cF1>Bool</span><span class=cF0> res = </span><span class=cF3>FALSE</span><span class=cF0>;
|
|
<a name="l46"></a>
|
|
<a name="l47"></a> </span><span class=cF1>if</span><span class=cF0> (!</span><span class=cF5>LBts</span><span class=cF7>(</span><span class=cF0>&bd->flags, </span><span class=cF3>BDf_INITIALIZED</span><span class=cF7>)</span><span class=cF0>)
|
|
<a name="l48"></a> </span><span class=cF7>{</span><span class=cF0>
|
|
<a name="l49"></a> bd->flags |= </span><span class=cF3>BDF_INIT_IN_PROGRESS</span><span class=cF0>;
|
|
<a name="l50"></a> </span><span class=cF1>switch</span><span class=cF0> (bd->type)
|
|
<a name="l51"></a> {
|
|
<a name="l52"></a> </span><span class=cF1>case</span><span class=cF0> </span><span class=cF3>BDT_RAM</span><span class=cF0>:
|
|
<a name="l53"></a> </span><span class=cF1>if</span><span class=cF0> (!bd->RAM_disk)
|
|
<a name="l54"></a> </span><span class=cF7>{</span><span class=cF0>
|
|
<a name="l55"></a> bd->RAM_disk = </span><span class=cF5>SysMAlloc</span><span class=cF0>(</span><span class=cF7>(</span><span class=cF0>bd->max_blk + </span><span class=cFE>1</span><span class=cF7>)</span><span class=cF0> << </span><span class=cF3>BLK_SIZE_BITS</span><span class=cF0>);
|
|
<a name="l56"></a> bd->max_blk = </span><span class=cF5>MSize</span><span class=cF0>(bd->RAM_disk) >> </span><span class=cF3>BLK_SIZE_BITS</span><span class=cF0> - </span><span class=cFE>1</span><span class=cF0>;
|
|
<a name="l57"></a> </span><span class=cF7>}</span><span class=cF0>
|
|
<a name="l58"></a> drive->fs_type = </span><span class=cF3>FSt_REDSEA</span><span class=cF0>;
|
|
<a name="l59"></a> drive->size = bd->max_blk + </span><span class=cFE>1</span><span class=cF0> - bd->drv_offset;
|
|
<a name="l60"></a> </span><span class=cF1>if</span><span class=cF0> (</span><span class=cFD>RedSeaValidate</span><span class=cF7>(</span><span class=cF0>bd->first_drive_let</span><span class=cF7>)</span><span class=cF0>)
|
|
<a name="l61"></a> </span><span class=cFD>RedSeaInit</span><span class=cF0>(drive);
|
|
<a name="l62"></a> </span><span class=cF1>else</span><span class=cF0>
|
|
<a name="l63"></a> </span><span class=cFD>RedSeaFormat</span><span class=cF0>(bd->first_drive_let);
|
|
<a name="l64"></a> res = </span><span class=cF3>TRUE</span><span class=cF0>;
|
|
<a name="l65"></a> </span><span class=cF1>break</span><span class=cF0>;
|
|
<a name="l66"></a>
|
|
<a name="l67"></a> </span><span class=cF1>case</span><span class=cF0> </span><span class=cF3>BDT_ISO_FILE_READ</span><span class=cF0>:
|
|
<a name="l68"></a> </span><span class=cF1>if</span><span class=cF0> (</span><span class=cF5>FileFind</span><span class=cF7>(</span><span class=cF0>bd->file_disk_name, &de, </span><span class=cF3>FUF_JUST_FILES</span><span class=cF7>)</span><span class=cF0>)
|
|
<a name="l69"></a> </span><span class=cF7>{</span><span class=cF0>
|
|
<a name="l70"></a> bd->max_blk = de.size >> </span><span class=cF3>BLK_SIZE_BITS</span><span class=cF0> - </span><span class=cFE>1</span><span class=cF0>;
|
|
<a name="l71"></a> </span><span class=cF1>try</span><span class=cF0>
|
|
<a name="l72"></a> bd->file_disk = </span><span class=cF5>FOpen</span><span class=cF0>(bd->file_disk_name, </span><span class=cF6>"rc"</span><span class=cF0>, bd->max_blk + </span><span class=cFE>1</span><span class=cF0>);
|
|
<a name="l73"></a> </span><span class=cF1>catch</span><span class=cF0>
|
|
<a name="l74"></a> {
|
|
<a name="l75"></a> </span><span class=cF1>if</span><span class=cF0> (</span><span class=cF5>Fs</span><span class=cF0>->except_ch == </span><span class=cF6>'File'</span><span class=cF0>)
|
|
<a name="l76"></a> </span><span class=cF5>PrintErr</span><span class=cF0>(</span><span class=cF6>"Not Contiguous. Move file to filename.ISO.C.\n"</span><span class=cF0>);
|
|
<a name="l77"></a> </span><span class=cF5>Fs</span><span class=cF0>->catch_except = </span><span class=cF3>TRUE</span><span class=cF0>;
|
|
<a name="l78"></a> }
|
|
<a name="l79"></a> </span><span class=cF1>if</span><span class=cF0> (bd->file_disk)
|
|
<a name="l80"></a> {
|
|
<a name="l81"></a> drive->fs_type = </span><span class=cF3>FSt_REDSEA</span><span class=cF0>;
|
|
<a name="l82"></a> drive->size = bd->max_blk + </span><span class=cFE>1</span><span class=cF0> - bd->drv_offset;
|
|
<a name="l83"></a> </span><span class=cF1>if</span><span class=cF0> (</span><span class=cFD>RedSeaValidate</span><span class=cF7>(</span><span class=cF0>bd->first_drive_let</span><span class=cF7>)</span><span class=cF0>)
|
|
<a name="l84"></a> </span><span class=cF7>{</span><span class=cF0>
|
|
<a name="l85"></a> </span><span class=cFD>RedSeaInit</span><span class=cF0>(drive);
|
|
<a name="l86"></a> res = </span><span class=cF3>TRUE</span><span class=cF0>;
|
|
<a name="l87"></a> </span><span class=cF7>}</span><span class=cF0>
|
|
<a name="l88"></a> </span><span class=cF1>else</span><span class=cF0>
|
|
<a name="l89"></a> </span><span class=cF5>PrintErr</span><span class=cF0>(</span><span class=cF6>"Not RedSea\n"</span><span class=cF0>);
|
|
<a name="l90"></a> }
|
|
<a name="l91"></a> </span><span class=cF7>}</span><span class=cF0>
|
|
<a name="l92"></a> </span><span class=cF1>break</span><span class=cF0>;
|
|
<a name="l93"></a>
|
|
<a name="l94"></a> </span><span class=cF1>case</span><span class=cF0> </span><span class=cF3>BDT_ISO_FILE_WRITE</span><span class=cF0>:
|
|
<a name="l95"></a> </span><span class=cF1>if</span><span class=cF0> (!bd->file_disk_name)
|
|
<a name="l96"></a> </span><span class=cF7>{</span><span class=cF0>
|
|
<a name="l97"></a> </span><span class=cF5>StrPrint</span><span class=cF0>(buf, </span><span class=cF6>"%C:/Drive%C.ISO.C"</span><span class=cF0>, </span><span class=cFB>blkdev</span><span class=cF0>.boot_drive_let, bd->first_drive_let);
|
|
<a name="l98"></a> bd->file_disk_name = </span><span class=cF5>SysStrNew</span><span class=cF0>(buf);
|
|
<a name="l99"></a> </span><span class=cF7>}</span><span class=cF0>
|
|
<a name="l100"></a> </span><span class=cF1>if</span><span class=cF0> (bd->max_blk < </span><span class=cFE>7</span><span class=cF0>)
|
|
<a name="l101"></a> bd->max_blk = </span><span class=cFE>7</span><span class=cF0>;
|
|
<a name="l102"></a> bd->file_disk = </span><span class=cF5>FOpen</span><span class=cF0>(bd->file_disk_name, </span><span class=cF6>"wc"</span><span class=cF0>, bd->max_blk + </span><span class=cFE>1</span><span class=cF0>);
|
|
<a name="l103"></a> drive->fs_type = </span><span class=cF3>FSt_REDSEA</span><span class=cF0>;
|
|
<a name="l104"></a> drive->size = bd->max_blk + </span><span class=cFE>1</span><span class=cF0> - bd->drv_offset;
|
|
<a name="l105"></a> </span><span class=cFD>RedSeaFormat</span><span class=cF0>(bd->first_drive_let);
|
|
<a name="l106"></a> </span><span class=cF5>CallExtStr</span><span class=cF0>(</span><span class=cF6>"RedSeaISO9660"</span><span class=cF0>, bd->file_disk_name, bd->first_drive_let);
|
|
<a name="l107"></a> res = </span><span class=cF3>TRUE</span><span class=cF0>;
|
|
<a name="l108"></a> </span><span class=cF1>break</span><span class=cF0>;
|
|
<a name="l109"></a>
|
|
<a name="l110"></a> </span><span class=cF1>case</span><span class=cF0> </span><span class=cF3>BDT_ATA</span><span class=cF0>:
|
|
<a name="l111"></a> bd->max_reads = </span><span class=cFE>128</span><span class=cF0>;
|
|
<a name="l112"></a> bd->max_writes = </span><span class=cFE>1</span><span class=cF0>;
|
|
<a name="l113"></a> res = </span><span class=cFD>AHCIAtaInit</span><span class=cF0>(bd);
|
|
<a name="l114"></a> </span><span class=cF1>break</span><span class=cF0>;
|
|
<a name="l115"></a>
|
|
<a name="l116"></a> </span><span class=cF1>case</span><span class=cF0> </span><span class=cF3>BDT_ATAPI</span><span class=cF0>:
|
|
<a name="l117"></a></span><span class=cF2>//0xFFFF*4 is too big for Terry's taste</span><span class=cF0>
|
|
<a name="l118"></a> bd->max_reads = </span><span class=cFE>0x800</span><span class=cF0> * </span><span class=cFE>4</span><span class=cF0>;
|
|
<a name="l119"></a></span><span class=cF2>//max of maybe a quarter of disk cache</span><span class=cF0>
|
|
<a name="l120"></a> </span><span class=cF1>if</span><span class=cF0> (bd->max_reads > </span><span class=cFB>blkdev</span><span class=cF0>.cache_size / </span><span class=cF3>BLK_SIZE</span><span class=cF0> / </span><span class=cFE>4</span><span class=cF0>)
|
|
<a name="l121"></a> bd->max_reads = </span><span class=cFB>blkdev</span><span class=cF0>.cache_size / </span><span class=cF3>BLK_SIZE</span><span class=cF0> / </span><span class=cFE>4</span><span class=cF0> & ~</span><span class=cFE>3</span><span class=cF0>;
|
|
<a name="l122"></a> </span><span class=cF1>if</span><span class=cF0> (bd->max_reads < </span><span class=cFE>128</span><span class=cF0>)
|
|
<a name="l123"></a> bd->max_reads = </span><span class=cFE>128</span><span class=cF0>;
|
|
<a name="l124"></a> bd->max_writes = </span><span class=cFE>0xFFFF</span><span class=cF0> * </span><span class=cFE>4</span><span class=cF0>;
|
|
<a name="l125"></a> </span><span class=cF1>if</span><span class=cF0> (res = </span><span class=cFD>AHCIAtaInit</span><span class=cF7>(</span><span class=cF0>bd</span><span class=cF7>)</span><span class=cF0>)
|
|
<a name="l126"></a> drive->size = bd->max_blk + </span><span class=cFE>1</span><span class=cF0>;
|
|
<a name="l127"></a> </span><span class=cF1>break</span><span class=cF0>;
|
|
<a name="l128"></a> }
|
|
<a name="l129"></a> </span><span class=cF1>if</span><span class=cF0> (res && bd->flags & </span><span class=cF3>BDF_READ_CACHE</span><span class=cF0>)
|
|
<a name="l130"></a> </span><span class=cF5>DiskCacheInvalidate</span><span class=cF0>(drive);
|
|
<a name="l131"></a> bd->flags &= ~</span><span class=cF3>BDF_INIT_IN_PROGRESS</span><span class=cF0>;
|
|
<a name="l132"></a> </span><span class=cF7>}</span><span class=cF0>
|
|
<a name="l133"></a> </span><span class=cF1>else</span><span class=cF0>
|
|
<a name="l134"></a> res = </span><span class=cF3>TRUE</span><span class=cF0>;
|
|
<a name="l135"></a>
|
|
<a name="l136"></a> </span><span class=cF1>return</span><span class=cF0> res;
|
|
<a name="l137"></a>}
|
|
<a name="l138"></a>
|
|
<a name="l139"></a></span><span class=cF1>U0</span><span class=cF0> </span><span class=cF5>BlkDevsRelease</span><span class=cF0>()
|
|
<a name="l140"></a>{</span><span class=cF2>//When task dies, release all owned BlkDevs.</span><span class=cF0>
|
|
<a name="l141"></a> </span><span class=cF9>I64</span><span class=cF0> i;
|
|
<a name="l142"></a> </span><span class=cF9>CBlkDev</span><span class=cF0> *bd;
|
|
<a name="l143"></a>
|
|
<a name="l144"></a> </span><span class=cF1>for</span><span class=cF0> (i = </span><span class=cFE>0</span><span class=cF0>; i < </span><span class=cF3>BLKDEVS_NUM</span><span class=cF0>; i++)
|
|
<a name="l145"></a> </span><span class=cF7>{</span><span class=cF0>
|
|
<a name="l146"></a> bd = &</span><span class=cFB>blkdev</span><span class=cF0>.blkdevs[i];
|
|
<a name="l147"></a> </span><span class=cF1>if</span><span class=cF0> (bd->owning_task == </span><span class=cF5>Fs</span><span class=cF0> && bd->bd_signature == </span><span class=cF3>BD_SIGNATURE_VAL</span><span class=cF0>)
|
|
<a name="l148"></a> </span><span class=cF5>BlkDevUnlock</span><span class=cF0>(bd, </span><span class=cF3>TRUE</span><span class=cF0>);
|
|
<a name="l149"></a> </span><span class=cF7>}</span><span class=cF0>
|
|
<a name="l150"></a>}
|
|
<a name="l151"></a>
|
|
<a name="l152"></a></span><span class=cF9>CBlkDev</span><span class=cF0> *</span><span class=cF5>BlkDevNextFreeSlot</span><span class=cF0>(</span><span class=cF1>U8</span><span class=cF0> first_drive_let, </span><span class=cF9>I64</span><span class=cF0> type)
|
|
<a name="l153"></a>{</span><span class=cF2>//Locate free slot for new BlkDev, like during </span><a href="https://zeal-operating-system.github.io/ZealOS/System/BlkDev/Mount.CC.html#l260"><span class=cF4>Mount</span></a><span class=cF2>().</span><span class=cF0>
|
|
<a name="l154"></a> </span><span class=cF9>I64</span><span class=cF0> i = </span><span class=cFE>0</span><span class=cF0>;
|
|
<a name="l155"></a> </span><span class=cF9>CBlkDev</span><span class=cF0> *res;
|
|
<a name="l156"></a>
|
|
<a name="l157"></a> </span><span class=cF1>if</span><span class=cF0> (</span><span class=cF5>Letter2BlkDevType</span><span class=cF7>(</span><span class=cF0>first_drive_let</span><span class=cF7>)</span><span class=cF0> != type)
|
|
<a name="l158"></a> </span><span class=cF5>throw</span><span class=cF0>(</span><span class=cF6>'BlkDev'</span><span class=cF0>);
|
|
<a name="l159"></a> </span><span class=cF1>do</span><span class=cF0>
|
|
<a name="l160"></a> </span><span class=cF7>{</span><span class=cF0>
|
|
<a name="l161"></a> res = &</span><span class=cFB>blkdev</span><span class=cF0>.blkdevs[i];
|
|
<a name="l162"></a> </span><span class=cF1>if</span><span class=cF0> (res->bd_signature != </span><span class=cF3>BD_SIGNATURE_VAL</span><span class=cF0>)
|
|
<a name="l163"></a> {
|
|
<a name="l164"></a> </span><span class=cF5>MemSet</span><span class=cF0>(res, </span><span class=cFE>0</span><span class=cF0>, </span><span class=cF1>sizeof</span><span class=cF7>(</span><span class=cF9>CBlkDev</span><span class=cF7>)</span><span class=cF0>);
|
|
<a name="l165"></a> res->first_drive_let = first_drive_let;
|
|
<a name="l166"></a> res->type = type;
|
|
<a name="l167"></a> res->flags = </span><span class=cF3>BDF_READ_CACHE</span><span class=cF0>;
|
|
<a name="l168"></a> res->blk_size = </span><span class=cF3>BLK_SIZE</span><span class=cF0>;
|
|
<a name="l169"></a> res->max_blk = </span><span class=cFE>0xEFFFFFFF</span><span class=cF0>;
|
|
<a name="l170"></a> </span><span class=cF1>switch</span><span class=cF0> (type)
|
|
<a name="l171"></a> </span><span class=cF7>{</span><span class=cF0>
|
|
<a name="l172"></a> </span><span class=cF1>case</span><span class=cF0> </span><span class=cF3>BDT_RAM</span><span class=cF0>:
|
|
<a name="l173"></a> res->flags &= ~</span><span class=cF3>BDF_READ_CACHE</span><span class=cF0>;
|
|
<a name="l174"></a> </span><span class=cF1>break</span><span class=cF0>;
|
|
<a name="l175"></a>
|
|
<a name="l176"></a> </span><span class=cF1>case</span><span class=cF0> </span><span class=cF3>BDT_ISO_FILE_READ</span><span class=cF0>:
|
|
<a name="l177"></a> res->flags |= </span><span class=cF3>BDF_READ_ONLY</span><span class=cF0>;
|
|
<a name="l178"></a> </span><span class=cF1>break</span><span class=cF0>;
|
|
<a name="l179"></a>
|
|
<a name="l180"></a> </span><span class=cF1>case</span><span class=cF0> </span><span class=cF3>BDT_ATAPI</span><span class=cF0>:
|
|
<a name="l181"></a> res->flags |= </span><span class=cF3>BDF_REMOVABLE</span><span class=cF0>|</span><span class=cF3>BDF_READ_ONLY</span><span class=cF0>;
|
|
<a name="l182"></a> res->blk_size = </span><span class=cF3>DVD_BLK_SIZE</span><span class=cF0>;
|
|
<a name="l183"></a> </span><span class=cF1>break</span><span class=cF0>;
|
|
<a name="l184"></a> </span><span class=cF7>}</span><span class=cF0>
|
|
<a name="l185"></a> </span><span class=cF1>return</span><span class=cF0> res;
|
|
<a name="l186"></a> }
|
|
<a name="l187"></a> </span><span class=cF7>}</span><span class=cF0>
|
|
<a name="l188"></a> </span><span class=cF1>while</span><span class=cF0> (++i < </span><span class=cF3>BLKDEVS_NUM</span><span class=cF0>);
|
|
<a name="l189"></a>
|
|
<a name="l190"></a> </span><span class=cF5>throw</span><span class=cF0>(</span><span class=cF6>'BlkDev'</span><span class=cF0>);
|
|
<a name="l191"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cF3>NULL</span><span class=cF0>; </span><span class=cF2>//never gets here</span><span class=cF0>
|
|
<a name="l192"></a>}
|
|
<a name="l193"></a>
|
|
<a name="l194"></a></span><span class=cF1>U0</span><span class=cF0> </span><span class=cF5>BlkDevDel</span><span class=cF0>(</span><span class=cF9>CBlkDev</span><span class=cF0> *bd)
|
|
<a name="l195"></a>{</span><span class=cF2>//Delete BlkDev</span><span class=cF0>
|
|
<a name="l196"></a> </span><span class=cFD>DriveBlkDevDel</span><span class=cF0>(bd);
|
|
<a name="l197"></a> </span><span class=cF5>FClose</span><span class=cF0>(bd->file_disk);
|
|
<a name="l198"></a> </span><span class=cF5>Free</span><span class=cF0>(bd->file_disk_name);
|
|
<a name="l199"></a> </span><span class=cF5>Free</span><span class=cF0>(bd->dev_id_record);
|
|
<a name="l200"></a> </span><span class=cF5>MemSet</span><span class=cF0>(bd, </span><span class=cFE>0</span><span class=cF0>, </span><span class=cF1>sizeof</span><span class=cF7>(</span><span class=cF9>CBlkDev</span><span class=cF7>)</span><span class=cF0>);
|
|
<a name="l201"></a>}
|
|
<a name="l202"></a>
|
|
<a name="l203"></a></span><span class=cF9>CBlkDev</span><span class=cF0> *</span><span class=cF5>BlkDevCheck</span><span class=cF0>(</span><span class=cF9>CBlkDev</span><span class=cF0> *bd, </span><span class=cF1>Bool</span><span class=cF0> except=</span><span class=cF3>TRUE</span><span class=cF0>)
|
|
<a name="l204"></a>{</span><span class=cF2>//Check for valid BlkDev. Throw exception.</span><span class=cF0>
|
|
<a name="l205"></a> </span><span class=cF1>if</span><span class=cF0> (!bd || bd->bd_signature != </span><span class=cF3>BD_SIGNATURE_VAL</span><span class=cF0> || !</span><span class=cF7>(</span><span class=cF3>BDT_NULL</span><span class=cF0><bd->type < </span><span class=cF3>BDT_TYPES_NUM</span><span class=cF7>)</span><span class=cF0>)
|
|
<a name="l206"></a> </span><span class=cF7>{</span><span class=cF0>
|
|
<a name="l207"></a> </span><span class=cF1>if</span><span class=cF0> (except)
|
|
<a name="l208"></a> </span><span class=cF5>throw</span><span class=cF0>(</span><span class=cF6>'BlkDev'</span><span class=cF0>);
|
|
<a name="l209"></a> </span><span class=cF1>else</span><span class=cF0>
|
|
<a name="l210"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cF3>NULL</span><span class=cF0>;
|
|
<a name="l211"></a> </span><span class=cF7>}</span><span class=cF0>
|
|
<a name="l212"></a> </span><span class=cF1>else</span><span class=cF0>
|
|
<a name="l213"></a> </span><span class=cF1>return</span><span class=cF0> bd;
|
|
<a name="l214"></a>}
|
|
<a name="l215"></a>
|
|
<a name="l216"></a></span><span class=cF9>CBlkDev</span><span class=cF0> *</span><span class=cF5>Letter2BlkDev</span><span class=cF0>(</span><span class=cF1>U8</span><span class=cF0> drv_let=</span><span class=cFE>0</span><span class=cF0>, </span><span class=cF1>Bool</span><span class=cF0> except=</span><span class=cF3>TRUE</span><span class=cF0>)
|
|
<a name="l217"></a>{</span><span class=cF2>//Drive letter to BlkDev ptr.</span><span class=cF0>
|
|
<a name="l218"></a> </span><span class=cF9>CDrive</span><span class=cF0> *drive;
|
|
<a name="l219"></a>
|
|
<a name="l220"></a> </span><span class=cF1>if</span><span class=cF0> (drive = </span><span class=cF5>Letter2Drive</span><span class=cF7>(</span><span class=cF0>drv_let, except</span><span class=cF7>)</span><span class=cF0>)
|
|
<a name="l221"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cF5>BlkDevCheck</span><span class=cF0>(drive->bd, except);
|
|
<a name="l222"></a> </span><span class=cF1>else</span><span class=cF0>
|
|
<a name="l223"></a> </span><span class=cF1>return</span><span class=cF0> </span><span class=cF3>NULL</span><span class=cF0>;
|
|
<a name="l224"></a>}
|
|
</span></pre></body>
|
|
</html>
|