ZealOS/docs/Kernel/BlkDev/DiskBlkDev.CC.html
TomAwezome 2b03787cc8 Fix OSUpgrade not updating master boot record.
Fix Mount2 AHCI Port value not being cleared on loop.
Change ordering of PersonalMenu links.
Increase Raw mode screen scroll from 1 line to 8 to improve bare-metal performance.
2021-08-06 01:07:27 -04:00

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-&gt;lock_fwding)
<a name="l6"></a> bd = bd-&gt;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>&amp;bd-&gt;locked_flags, </span><span class=cF3>BDlf_LOCKED</span><span class=cF7>)</span><span class=cF0> || bd-&gt;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>&amp;bd-&gt;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-&gt;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-&gt;lock_fwding)
<a name="l25"></a> bd = bd-&gt;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>&amp;bd-&gt;locked_flags, </span><span class=cF3>BDlf_LOCKED</span><span class=cF7>)</span><span class=cF0> &amp;&amp; bd-&gt;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-&gt;flags &amp;= ~(</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-&gt;owning_task = </span><span class=cF3>NULL</span><span class=cF0>;
<a name="l32"></a> </span><span class=cF5>LBtr</span><span class=cF0>(&amp;bd-&gt;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-&gt;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>&amp;bd-&gt;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-&gt;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-&gt;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-&gt;RAM_disk)
<a name="l54"></a> </span><span class=cF7>{</span><span class=cF0>
<a name="l55"></a> bd-&gt;RAM_disk = </span><span class=cF5>SysMAlloc</span><span class=cF0>(</span><span class=cF7>(</span><span class=cF0>bd-&gt;max_blk + </span><span class=cFE>1</span><span class=cF7>)</span><span class=cF0> &lt;&lt; </span><span class=cF3>BLK_SIZE_BITS</span><span class=cF0>);
<a name="l56"></a> bd-&gt;max_blk = </span><span class=cF5>MSize</span><span class=cF0>(bd-&gt;RAM_disk) &gt;&gt; </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-&gt;fs_type = </span><span class=cF3>FSt_REDSEA</span><span class=cF0>;
<a name="l59"></a> drive-&gt;size = bd-&gt;max_blk + </span><span class=cFE>1</span><span class=cF0> - bd-&gt;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-&gt;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-&gt;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-&gt;file_disk_name, &amp;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-&gt;max_blk = de.size &gt;&gt; </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-&gt;file_disk = </span><span class=cF5>FOpen</span><span class=cF0>(bd-&gt;file_disk_name, </span><span class=cF6>&quot;rc&quot;</span><span class=cF0>, bd-&gt;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>-&gt;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>&quot;Not Contiguous. Move file to filename.ISO.C.\n&quot;</span><span class=cF0>);
<a name="l77"></a> </span><span class=cF5>Fs</span><span class=cF0>-&gt;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-&gt;file_disk)
<a name="l80"></a> {
<a name="l81"></a> drive-&gt;fs_type = </span><span class=cF3>FSt_REDSEA</span><span class=cF0>;
<a name="l82"></a> drive-&gt;size = bd-&gt;max_blk + </span><span class=cFE>1</span><span class=cF0> - bd-&gt;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-&gt;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>&quot;Not RedSea\n&quot;</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-&gt;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>&quot;%C:/Drive%C.ISO.C&quot;</span><span class=cF0>, </span><span class=cFB>blkdev</span><span class=cF0>.boot_drive_let, bd-&gt;first_drive_let);
<a name="l98"></a> bd-&gt;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-&gt;max_blk &lt; </span><span class=cFE>7</span><span class=cF0>)
<a name="l101"></a> bd-&gt;max_blk = </span><span class=cFE>7</span><span class=cF0>;
<a name="l102"></a> bd-&gt;file_disk = </span><span class=cF5>FOpen</span><span class=cF0>(bd-&gt;file_disk_name, </span><span class=cF6>&quot;wc&quot;</span><span class=cF0>, bd-&gt;max_blk + </span><span class=cFE>1</span><span class=cF0>);
<a name="l103"></a> drive-&gt;fs_type = </span><span class=cF3>FSt_REDSEA</span><span class=cF0>;
<a name="l104"></a> drive-&gt;size = bd-&gt;max_blk + </span><span class=cFE>1</span><span class=cF0> - bd-&gt;drv_offset;
<a name="l105"></a> </span><span class=cFD>RedSeaFormat</span><span class=cF0>(bd-&gt;first_drive_let);
<a name="l106"></a> </span><span class=cF5>CallExtStr</span><span class=cF0>(</span><span class=cF6>&quot;RedSeaISO9660&quot;</span><span class=cF0>, bd-&gt;file_disk_name, bd-&gt;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-&gt;max_reads = </span><span class=cFE>128</span><span class=cF0>;
<a name="l112"></a> bd-&gt;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-&gt;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-&gt;max_reads &gt; </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-&gt;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> &amp; ~</span><span class=cFE>3</span><span class=cF0>;
<a name="l122"></a> </span><span class=cF1>if</span><span class=cF0> (bd-&gt;max_reads &lt; </span><span class=cFE>128</span><span class=cF0>)
<a name="l123"></a> bd-&gt;max_reads = </span><span class=cFE>128</span><span class=cF0>;
<a name="l124"></a> bd-&gt;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-&gt;size = bd-&gt;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 &amp;&amp; bd-&gt;flags &amp; </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-&gt;flags &amp;= ~</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 &lt; </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 = &amp;</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-&gt;owning_task == </span><span class=cF5>Fs</span><span class=cF0> &amp;&amp; bd-&gt;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#l301"><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 = &amp;</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-&gt;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-&gt;first_drive_let = first_drive_let;
<a name="l166"></a> res-&gt;type = type;
<a name="l167"></a> res-&gt;flags = </span><span class=cF3>BDF_READ_CACHE</span><span class=cF0>;
<a name="l168"></a> res-&gt;blk_size = </span><span class=cF3>BLK_SIZE</span><span class=cF0>;
<a name="l169"></a> res-&gt;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-&gt;flags &amp;= ~</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-&gt;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-&gt;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-&gt;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 &lt; </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-&gt;file_disk);
<a name="l198"></a> </span><span class=cF5>Free</span><span class=cF0>(bd-&gt;file_disk_name);
<a name="l199"></a> </span><span class=cF5>Free</span><span class=cF0>(bd-&gt;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-&gt;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>&lt;bd-&gt;type &lt; </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-&gt;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>