ZealOS/docs/Kernel/BlkDev/DiskBlkDev.CC.html
TomAwezome 67479705de Add SATA port number reporting to DriveRep.
Improve Lex assert failure warning to give exact line number.
Remove some deprecated IDE functions.
Add default arg to Drive.
Fix raw-mode printing in StackRep, DriveRep, SATARep, Mount2, and CharGet.
Change LongLines cols default arg from 80 to 128.
2021-08-04 15:25:55 -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#l297"><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>