home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _08b7768450e9abdaf78dde3ad49d074c < prev    next >
Text File  |  2000-03-23  |  100KB  |  1,727 lines

  1.  
  2. <HTML>
  3. <HEAD>
  4. <TITLE>Win32API::File - Low-level access to Win32 system API calls for files/dirs.</TITLE>
  5. <LINK REL="stylesheet" HREF="../../../Active.css" TYPE="text/css">
  6. <LINK REV="made" HREF="mailto:">
  7. </HEAD>
  8.  
  9. <BODY>
  10. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  11. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  12. <STRONG><P CLASS=block> Win32API::File - Low-level access to Win32 system API calls for files/dirs.</P></STRONG>
  13. </TD></TR>
  14. </TABLE>
  15.  
  16. <A NAME="__index__"></A>
  17. <!-- INDEX BEGIN -->
  18.  
  19. <UL>
  20.  
  21.     <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
  22.  
  23.     <LI><A HREF="#synopsis">SYNOPSIS</A></LI>
  24.     <LI><A HREF="#description">DESCRIPTION</A></LI>
  25.     <UL>
  26.  
  27.         <LI><A HREF="#exports">Exports</A></LI>
  28.     </UL>
  29.  
  30.     <LI><A HREF="#bugs">BUGS</A></LI>
  31.     <LI><A HREF="#author">AUTHOR</A></LI>
  32.     <LI><A HREF="#see also">SEE ALSO</A></LI>
  33. </UL>
  34. <!-- INDEX END -->
  35.  
  36. <HR>
  37. <P>
  38. <H1><A NAME="name">NAME</A></H1>
  39. <P>Win32API::File - Low-level access to Win32 system API calls for files/dirs.</P>
  40. <P>
  41. <HR>
  42. <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
  43. <UL>
  44. <LI>Windows</LI>
  45. </UL>
  46. <HR>
  47. <H1><A NAME="synopsis">SYNOPSIS</A></H1>
  48. <PRE>
  49.   use Win32API::File 0.02 qw( :ALL );</PRE>
  50. <PRE>
  51.   MoveFile( $Source, $Destination )
  52.     or  die "Can't move $Source to $Destination: $^E\n";
  53.   MoveFileEx( $Source, $Destination, MOVEFILE_REPLACE_EXISTING() )
  54.     or  die "Can't move $Source to $Destination: $^E\n";</PRE>
  55. <P>
  56. <HR>
  57. <H1><A NAME="description">DESCRIPTION</A></H1>
  58. <P>This provides fairly low-level access to the Win32 System API
  59. calls dealing with files and directories.</P>
  60. <P>To pass in <CODE>NULL</CODE> as the pointer to an optional buffer, pass in
  61. an empty list reference, <CODE>[]</CODE>.</P>
  62. <P>Beyond raw access to the API calls and related constants, this module
  63. handles smart buffer allocation and translation of return codes.</P>
  64. <P>All functions, unless otherwise noted, return a true value for success
  65. and a false value for failure and set <CODE>$^E</CODE> on failure.</P>
  66. <P>
  67. <H2><A NAME="exports">Exports</A></H2>
  68. <P>Nothing is exported by default.  The following tags can be used to
  69. have large sets of symbols exported:  <A HREF="#item_%22%3AFunc%22"><CODE>":Func"</CODE></A>, <A HREF="#item_%22%3AFuncA%22"><CODE>":FuncA"</CODE></A>,
  70. <A HREF="#item_%22%3AFuncW%22"><CODE>":FuncW"</CODE></A>, <A HREF="#item_%22%3AMisc%22"><CODE>":Misc"</CODE></A>, <A HREF="#item_%22%3ADDD_%22"><CODE>":DDD_"</CODE></A>, <A HREF="#item_%22%3ADRIVE_%22"><CODE>":DRIVE_"</CODE></A>, <A HREF="#item_%22%3AFILE_%22"><CODE>":FILE_"</CODE></A>,
  71. <A HREF="#item_%22%3AFILE_ATTRIBUTE_%22"><CODE>":FILE_ATTRIBUTE_"</CODE></A>, <A HREF="#item_%22%3AFILE_FLAG_%22"><CODE>":FILE_FLAG_"</CODE></A>, <A HREF="#item_%22%3AFILE_SHARE_%22"><CODE>":FILE_SHARE_"</CODE></A>,
  72. <A HREF="#item_%22%3AFILE_TYPE_%22"><CODE>":FILE_TYPE_"</CODE></A>, <A HREF="#item_%22%3AFS_%22"><CODE>":FS_"</CODE></A>, <A HREF="#item_%22%3AIOCTL_STORAGE_%22"><CODE>":IOCTL_STORAGE_"</CODE></A>, <A HREF="#item_%22%3AIOCTL_DISK_%22"><CODE>":IOCTL_DISK_"</CODE></A>,
  73. <A HREF="#item_%22%3AGENERIC_%22"><CODE>":GENERIC_"</CODE></A>, <A HREF="#item_%22%3AMEDIA_TYPE%22"><CODE>":MEDIA_TYPE"</CODE></A>, <A HREF="#item_%22%3AMOVEFILE_%22"><CODE>":MOVEFILE_"</CODE></A>, <A HREF="#item_%22%3ASECURITY_%22"><CODE>":SECURITY_"</CODE></A>,
  74. <A HREF="#item_%22%3ASEM_%22"><CODE>":SEM_"</CODE></A>, and <A HREF="#item_%22%3APARTITION_%22"><CODE>":PARTITION_"</CODE></A>.</P>
  75. <DL>
  76. <DT><STRONG><A NAME="item_%22%3AFunc%22"><CODE>":Func"</CODE></A></STRONG><BR>
  77. <DD>
  78. The basic function names: <A HREF="#item_attrLetsToBits"><CODE>attrLetsToBits</CODE></A>, <A HREF="#item_createFile"><CODE>createFile</CODE></A>,
  79. <A HREF="#item_getLogicalDrives"><CODE>getLogicalDrives</CODE></A>, <A HREF="#item_CloseHandle"><CODE>CloseHandle</CODE></A>, <A HREF="#item_CopyFile"><CODE>CopyFile</CODE></A>, <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A>,
  80. <A HREF="#item_DeleteFile"><CODE>DeleteFile</CODE></A>, <A HREF="#item_DefineDosDevice"><CODE>DefineDosDevice</CODE></A>, <A HREF="#item_DeviceIoControl"><CODE>DeviceIoControl</CODE></A>,
  81. <A HREF="#item_FdGetOsFHandle"><CODE>FdGetOsFHandle</CODE></A>, <A HREF="#item_GetDriveType"><CODE>GetDriveType</CODE></A>, <A HREF="#item_GetFileType"><CODE>GetFileType</CODE></A>, <A HREF="#item_GetLogicalDrives"><CODE>GetLogicalDrives</CODE></A>,
  82. <A HREF="#item_GetLogicalDriveStrings"><CODE>GetLogicalDriveStrings</CODE></A>, <A HREF="#item_GetOsFHandle"><CODE>GetOsFHandle</CODE></A>, <A HREF="#item_GetVolumeInformation"><CODE>GetVolumeInformation</CODE></A>,
  83. <A HREF="#item_IsRecognizedPartition"><CODE>IsRecognizedPartition</CODE></A>, <A HREF="#item_IsContainerPartition"><CODE>IsContainerPartition</CODE></A>, <A HREF="#item_MoveFile"><CODE>MoveFile</CODE></A>,
  84. <A HREF="#item_MoveFileEx"><CODE>MoveFileEx</CODE></A>, <A HREF="#item_OsFHandleOpen"><CODE>OsFHandleOpen</CODE></A>, <A HREF="#item_OsFHandleOpenFd"><CODE>OsFHandleOpenFd</CODE></A>, <A HREF="#item_QueryDosDevice"><CODE>QueryDosDevice</CODE></A>,
  85. <A HREF="#item_ReadFile"><CODE>ReadFile</CODE></A>, <A HREF="#item_SetFilePointer"><CODE>SetFilePointer</CODE></A>, <A HREF="#item_SetErrorMode"><CODE>SetErrorMode</CODE></A>, and <A HREF="#item_WriteFile"><CODE>WriteFile</CODE></A>.
  86. <DL>
  87. <DT><STRONG><A NAME="item_attrLetsToBits">attrLetsToBits</A></STRONG><BR>
  88. <DD>
  89. <DT><STRONG><CODE>$uBits= attrLetsToBits( $sAttributeLetters )</CODE></STRONG><BR>
  90. <DD>
  91. Converts a string of file attribute letters into an unsigned value with
  92. the corresponding bits set.  <CODE>$sAttributeLetters</CODE> should contain zero
  93. or more letters from <CODE>"achorst"</CODE>:
  94. <DL>
  95. <DT><STRONG><A NAME="item_%22a%22"><CODE>"a"</CODE></A></STRONG><BR>
  96. <DD>
  97. <CODE>FILE_ATTRIBUTE_ARCHIVE</CODE>
  98. <P></P>
  99. <DT><STRONG><A NAME="item_%22c%22"><CODE>"c"</CODE></A></STRONG><BR>
  100. <DD>
  101. <CODE>FILE_ATTRIBUTE_COMPRESSED</CODE>
  102. <P></P>
  103. <DT><STRONG><A NAME="item_%22h%22"><CODE>"h"</CODE></A></STRONG><BR>
  104. <DD>
  105. <CODE>FILE_ATTRIBUTE_HIDDEN</CODE>
  106. <P></P>
  107. <DT><STRONG><A NAME="item_%22o%22"><CODE>"o"</CODE></A></STRONG><BR>
  108. <DD>
  109. <CODE>FILE_ATTRIBUTE_OFFLINE</CODE>
  110. <P></P>
  111. <DT><STRONG><A NAME="item_%22r%22"><CODE>"r"</CODE></A></STRONG><BR>
  112. <DD>
  113. <CODE>FILE_ATTRIBUTE_READONLY</CODE>
  114. <P></P>
  115. <DT><STRONG><A NAME="item_%22s%22"><CODE>"s"</CODE></A></STRONG><BR>
  116. <DD>
  117. <CODE>FILE_ATTRIBUTE_SYSTEM</CODE>
  118. <P></P>
  119. <DT><STRONG><A NAME="item_%22t%22"><CODE>"t"</CODE></A></STRONG><BR>
  120. <DD>
  121. <CODE>FILE_ATTRIBUTE_TEMPORARY</CODE>
  122. <P></P></DL>
  123. <DT><STRONG><A NAME="item_createFile">createFile</A></STRONG><BR>
  124. <DD>
  125. <DT><STRONG><CODE>$hObject= createFile( $sPath )</CODE></STRONG><BR>
  126. <DD>
  127. <DT><STRONG><CODE>$hObject= createFile( $sPath, $rvhvOptions )</CODE></STRONG><BR>
  128. <DD>
  129. <DT><STRONG><CODE>$hObject= createFile( $sPath, $svAccess )</CODE></STRONG><BR>
  130. <DD>
  131. <DT><STRONG><CODE>$hObject= createFile( $sPath, $svAccess, $rvhvOptions )</CODE></STRONG><BR>
  132. <DD>
  133. <DT><STRONG><CODE>$hObject= createFile( $sPath, $svAccess, $svShare )</CODE></STRONG><BR>
  134. <DD>
  135. <DT><STRONG><CODE>$hObject= createFile( $sPath, $svAccess, $svShare, $rvhvOptions )</CODE></STRONG><BR>
  136. <DD>
  137. This is a Perl-friendly wrapper around <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A>.
  138. <P>On failure, <CODE>$hObject</CODE> gets set to a false value and <CODE>$^E</CODE> is set
  139. to the reason for the failure.  Otherwise, <CODE>$hObject</CODE> gets set to
  140. a Win32 native file handle which is alwasy a true value [returns
  141. <CODE>"0 but true"</CODE> in the impossible case of the handle having a value
  142. of <CODE>0</CODE>].</P>
  143. <P><CODE>$sPath</CODE> is the path to the file [or device, etc.] to be opened.  See
  144. <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A> for more information on possible special values for
  145. <CODE>$sPath</CODE>.</P>
  146. <P><CODE>$svAccess</CODE> can be a number containing the bit mask representing the
  147. specific <CODE>type(s)</CODE> of access to the file that you desire.  See the <CODE>$uAccess</CODE>
  148. parameter to <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A> for more information on these values.</P>
  149. <P>More likely, <CODE>$svAccess</CODE> is a string describing the generic type of access
  150. you desire and possibly the file creation options to use.  In this case,
  151. <CODE>$svAccess</CODE> should contain zero or more characters from <CODE>"qrw"</CODE> [access
  152. desired], zero or one character each from <CODE>"ktn"</CODE> and <CODE>"ce"</CODE>, and optional
  153. white space.  These letters stand for, respectively, ``Query access'', ``Read
  154. access'', ``Write access'', ``Keep if exists'', ``Truncate if exists'', ``New file
  155. only'', ``Create if none'', and ``Existing file only''.  Case is ignored.</P>
  156. <P>You can pass in <CODE>"?"</CODE> for <CODE>$svAccess</CODE> to have an error message displayed
  157. summarizing its possible values.  This is very handy when doing on-the-fly
  158. programming using the Perl debugger:</P>
  159. <PRE>
  160.     Win32API::File::createFile:  $svAccess can use the following:
  161.         One or more of the following:
  162.             q -- Query access (same as 0)
  163.             r -- Read access (GENERIC_READ)
  164.             w -- Write access (GENERIC_WRITE)
  165.         At most one of the following:
  166.             k -- Keep if exists
  167.             t -- Truncate if exists
  168.             n -- New file only (fail if file already exists)
  169.         At most one of the following:
  170.             c -- Create if doesn't exist
  171.             e -- Existing file only (fail if doesn't exist)
  172.       ''   is the same as 'q  k e'
  173.       'r'  is the same as 'r  k e'
  174.       'w'  is the same as 'w  t c'
  175.       'rw' is the same as 'rw k c'
  176.       'rt' or 'rn' implies 'c'.
  177.       Or $access can be numeric.</PRE>
  178. <P><CODE>$svAccess</CODE> is designed to be ``do what I mean'', so you can skip the rest of
  179. its explanation unless you are interested in the complex details.  Note
  180. that, if you want write access to a device, you need to specify <A HREF="#item_%22k%22"><CODE>"k"</CODE></A> and
  181. <A HREF="#item_%22e%22"><CODE>"e"</CODE></A> [as in <CODE>"w ke"</CODE> or <CODE>"rw ke"</CODE>] since Win32 requires <CODE>OPEN_EXISTING</CODE>
  182. be used when opening a device.</P>
  183. <DL>
  184. <DT><STRONG><A NAME="item_%22q%22"><CODE>"q"</CODE></A></STRONG><BR>
  185. <DD>
  186. Stands for ``Query access''.  This is really a no-op since you always have
  187. query access when you open a file.  You can specify <A HREF="#item_%22q%22"><CODE>"q"</CODE></A> to document
  188. that you plan to query the file [or device, etc.].  This is especially
  189. helpful when you don't want read nor write access since something like
  190. <A HREF="#item_%22q%22"><CODE>"q"</CODE></A> or <CODE>"q ke"</CODE> may be easier to understand than just <CODE>""</CODE> or <A HREF="#item_%22ke%22"><CODE>"ke"</CODE></A>.
  191. <P></P>
  192. <DT><STRONG><CODE>"r"</CODE></STRONG><BR>
  193. <DD>
  194. Stands for ``Read access''.  Sets the <CODE>GENERIC_READ</CODE> <CODE>bit(s)</CODE> in the
  195. <CODE>$uAccess</CODE> that is passed to <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A>.  This is the default
  196. access if the <CODE>$svAccess</CODE> parameter is missing or is <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> and
  197. if not overridden by <CODE>$rvhvOptions</CODE>.
  198. <P></P>
  199. <DT><STRONG><A NAME="item_%22w%22"><CODE>"w"</CODE></A></STRONG><BR>
  200. <DD>
  201. Stands for ``Write access''.  Sets the <CODE>GENERIC_WRITE</CODE> <CODE>bit(s)</CODE> in the
  202. <CODE>$uAccess</CODE> that is passed to <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A>.
  203. <P></P>
  204. <DT><STRONG><A NAME="item_%22k%22"><CODE>"k"</CODE></A></STRONG><BR>
  205. <DD>
  206. Stands for ``Keep if exists''.  If the requested file exists, then it is
  207. opened.  This is the default unless <CODE>GENERIC_WRITE</CODE> access has been
  208. requested but <CODE>GENERIC_READ</CODE> access has not been requested.   Contrast
  209. with <A HREF="#item_%22t%22"><CODE>"t"</CODE></A> and <A HREF="#item_%22n%22"><CODE>"n"</CODE></A>.
  210. <P></P>
  211. <DT><STRONG><CODE>"t"</CODE></STRONG><BR>
  212. <DD>
  213. Stands for ``Truncate if exists''.  If the requested file exists, then
  214. it is truncated to zero length and then opened.  This is the default if
  215. <CODE>GENERIC_WRITE</CODE> access has been requested and <CODE>GENERIC_READ</CODE> access has
  216. not been requested.  Contrast with <A HREF="#item_%22k%22"><CODE>"k"</CODE></A> and <A HREF="#item_%22n%22"><CODE>"n"</CODE></A>.
  217. <P></P>
  218. <DT><STRONG><A NAME="item_%22n%22"><CODE>"n"</CODE></A></STRONG><BR>
  219. <DD>
  220. Stands for ``New file only''.  If the requested file exists, then it is
  221. not opened and the <A HREF="#item_createFile"><CODE>createFile</CODE></A> call fails.  Contrast with <A HREF="#item_%22k%22"><CODE>"k"</CODE></A> and
  222. <A HREF="#item_%22t%22"><CODE>"t"</CODE></A>.  Can't be used with <A HREF="#item_%22e%22"><CODE>"e"</CODE></A>.
  223. <P></P>
  224. <DT><STRONG><CODE>"c"</CODE></STRONG><BR>
  225. <DD>
  226. Stands for ``Create if none''.  If the requested file does not exist, then
  227. it is created and then opened.  This is the default if <CODE>GENERIC_WRITE</CODE>
  228. access has been requested or if <A HREF="#item_%22t%22"><CODE>"t"</CODE></A> or <A HREF="#item_%22n%22"><CODE>"n"</CODE></A> was specified.  Contrast
  229. with <A HREF="#item_%22e%22"><CODE>"e"</CODE></A>.
  230. <P></P>
  231. <DT><STRONG><A NAME="item_%22e%22"><CODE>"e"</CODE></A></STRONG><BR>
  232. <DD>
  233. Stands for ``Existing file only''.  If the requested file does not exist, then
  234. nothing is opened and the <A HREF="#item_createFile"><CODE>createFile</CODE></A> call fails.  This is the default
  235. unless <CODE>GENERIC_WRITE</CODE> access has been requested or <A HREF="#item_%22t%22"><CODE>"t"</CODE></A> or <A HREF="#item_%22n%22"><CODE>"n"</CODE></A> was
  236. specified.   Contrast with <A HREF="#item_%22c%22"><CODE>"c"</CODE></A>.   Can't be used with <A HREF="#item_%22n%22"><CODE>"n"</CODE></A>.
  237. <P></P></DL>
  238. <P>The characters from <CODE>"ktn"</CODE> and <CODE>"ce"</CODE> are combined to determine the
  239. what value for <CODE>$uCreate</CODE> to pass to <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A> [unless overridden
  240. by <CODE>$rvhvOptions</CODE>]:</P>
  241. <DL>
  242. <DT><STRONG><A NAME="item_%22kc%22"><CODE>"kc"</CODE></A></STRONG><BR>
  243. <DD>
  244. <CODE>OPEN_ALWAYS</CODE>
  245. <P></P>
  246. <DT><STRONG><A NAME="item_%22ke%22"><CODE>"ke"</CODE></A></STRONG><BR>
  247. <DD>
  248. <CODE>OPEN_EXISTING</CODE>
  249. <P></P>
  250. <DT><STRONG><A NAME="item_%22tc%22"><CODE>"tc"</CODE></A></STRONG><BR>
  251. <DD>
  252. <CODE>TRUNCATE_EXISTING</CODE>
  253. <P></P>
  254. <DT><STRONG><A NAME="item_%22te%22"><CODE>"te"</CODE></A></STRONG><BR>
  255. <DD>
  256. <CODE>CREATE_ALWAYS</CODE>
  257. <P></P>
  258. <DT><STRONG><A NAME="item_%22nc%22"><CODE>"nc"</CODE></A></STRONG><BR>
  259. <DD>
  260. <CODE>CREATE_NEW</CODE>
  261. <P></P>
  262. <DT><STRONG><A NAME="item_%22ne%22"><CODE>"ne"</CODE></A></STRONG><BR>
  263. <DD>
  264. Illegal.
  265. <P></P></DL>
  266. <P><CODE>$svShare</CODE> controls how the file is shared, that is, whether other
  267. processes can have read, write, and/or delete access to the file while
  268. we have it opened.  <CODE>$svShare</CODE> will usually be a string containing zero
  269. or more characters from <CODE>"rwd"</CODE> but can also be a numeric bit mask.</P>
  270. <P><A HREF="#item_%22r%22"><CODE>"r"</CODE></A> sets the <CODE>FILE_SHARE_READ</CODE> bit which allows other processes to have
  271. read access to the file.  <A HREF="#item_%22w%22"><CODE>"w"</CODE></A> sets the <CODE>FILE_SHARE_WRITE</CODE> bit which
  272. allows other processes to have write access to the file.  <CODE>"d"</CODE> sets the
  273. <CODE>FILE_SHARE_DELETE</CODE> bit which allows other processes to have delete access
  274. to the file [ignored under Windows 95].</P>
  275. <P>The default for <CODE>$svShare</CODE> is <CODE>"rw"</CODE> which provides the same sharing as
  276. using regular perl <A HREF="../../../lib/Pod/perlfunc.html#item_open"><CODE>open()</CODE></A>.</P>
  277. <P>If another process currently has read, write, and/or delete access to
  278. the file and you don't allow that level of sharing, then your call to
  279. <A HREF="#item_createFile"><CODE>createFile</CODE></A> will fail.  If you requested read, write, and/or delete
  280. access and another process already has the file open but doesn't allow
  281. that level of sharing, thenn your call to <A HREF="#item_createFile"><CODE>createFile</CODE></A> will fail.  Once
  282. you have the file open, if another process tries to open it with read,
  283. write, and/or delete access and you don't allow that level of sharing,
  284. then that process won't be allowed to open the file.</P>
  285. <P><CODE>$rvhvOptions</CODE> is a reference to a hash where any keys must be from
  286. the list <A HREF="../../../lib/Pod/perlfunc.html#item_qw"><CODE>qw( Access Create Share Attributes Flags Security Model )</CODE></A>.
  287. The meaning of the value depends on the key name, as described below.
  288. Any option values in <CODE>$rvhvOptions</CODE> override the settings from <CODE>$svAccess</CODE>
  289. and <CODE>$svShare</CODE> if they conflict.</P>
  290. <DL>
  291. <DT><STRONG><A NAME="item_Flags_%3D%3E_%24uFlags">Flags => $uFlags</A></STRONG><BR>
  292. <DD>
  293. <CODE>$uFlags</CODE> is an unsigned value having any of the <CODE>FILE_FLAG_*</CODE> or
  294. <CODE>FILE_ATTRIBUTE_*</CODE> bits set.  Any <CODE>FILE_ATTRIBUTE_*</CODE> bits set via the
  295. <CODE>Attributes</CODE> option are logically <CODE>or</CODE>ed with these bits.  Defaults
  296. to <CODE>0</CODE>.
  297. <P>If opening the client side of a named pipe, then you can also specify
  298. <CODE>SECURITY_SQOS_PRESENT</CODE> along with one of the other <CODE>SECURITY_*</CODE>
  299. constants to specify the security quality of service to be used.</P>
  300. <P></P>
  301. <DT><STRONG><A NAME="item_Attributes_%3D%3E_%24sAttributes">Attributes => $sAttributes</A></STRONG><BR>
  302. <DD>
  303. A string of zero or more characters from <CODE>"achorst"</CODE> [see <A HREF="#item_attrLetsToBits"><CODE>attrLetsToBits</CODE></A>
  304. for more information] which are converted to <CODE>FILE_ATTRIBUTE_*</CODE> bits to
  305. be set in the <CODE>$uFlags</CODE> argument passed to <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A>.
  306. <P></P>
  307. <DT><STRONG><A NAME="item_Security_%3D%3E_%24pSecurityAttributes">Security => $pSecurityAttributes</A></STRONG><BR>
  308. <DD>
  309. <CODE>$pSecurityAttributes</CODE> should contain a <CODE>SECURITY_ATTRIBUTES</CODE> structure
  310. packed into a string or <CODE>[]</CODE> [the default].
  311. <P></P>
  312. <DT><STRONG><A NAME="item_Model_%3D%3E_%24hModelFile">Model => $hModelFile</A></STRONG><BR>
  313. <DD>
  314. <CODE>$hModelFile</CODE> should contain a handle opened with <CODE>GENERIC_READ</CODE>
  315. access to a model file from which file attributes and extended attributes
  316. are to be copied.  Or <CODE>$hModelFile</CODE> can be <CODE>0</CODE> [the default].
  317. <P></P>
  318. <DT><STRONG><A NAME="item_Access_%3D%3E_%24sAccess">Access => $sAccess</A></STRONG><BR>
  319. <DD>
  320. <DT><STRONG><A NAME="item_Access_%3D%3E_%24uAccess">Access => $uAccess</A></STRONG><BR>
  321. <DD>
  322. <CODE>$sAccess</CODE> should be a string of zero or more characters from
  323. <CODE>"qrw"</CODE> specifying the type of access desired:  ``query'' or <CODE>0</CODE>,
  324. ``read'' or <CODE>GENERIC_READ</CODE> [the default], or ``write'' or
  325. <CODE>GENERIC_WRITE</CODE>.
  326. <P><CODE>$uAccess</CODE> should be an unsigned value containing bits set to
  327. indicate the type of access desired.  <CODE>GENERIC_READ</CODE> is the default.</P>
  328. <P></P>
  329. <DT><STRONG><A NAME="item_Create_%3D%3E_%24sCreate">Create => $sCreate</A></STRONG><BR>
  330. <DD>
  331. <DT><STRONG><A NAME="item_Create_%3D%3E_%24uCreate">Create => $uCreate</A></STRONG><BR>
  332. <DD>
  333. <CODE>$sCreate</CODE> should be a string constaing zero or one character from
  334. <CODE>"ktn"</CODE> and zero or one character from <CODE>"ce"</CODE>.  These stand for
  335. ``keep if exists'', ``truncate if exists'', ``new file only'', ``create if
  336. none'', and ``existing file only''.  These are translated into a
  337. <CODE>$uCreate</CODE> value.
  338. <P><CODE>$uCreate</CODE> should be one of <CODE>OPEN_ALWAYS</CODE>, <CODE>OPEN_EXISTING</CODE>,
  339. <CODE>TRUNCATE_EXISTING</CODE>, <CODE>CREATE_ALWAYS</CODE>, or <CODE>CREATE_NEW</CODE>.</P>
  340. <P></P>
  341. <DT><STRONG><A NAME="item_Share_%3D%3E_%24sShare">Share => $sShare</A></STRONG><BR>
  342. <DD>
  343. <DT><STRONG><A NAME="item_Share_%3D%3E_%24uShare">Share => $uShare</A></STRONG><BR>
  344. <DD>
  345. <CODE>$sShare</CODE> should be a string with zero or more characters from
  346. <CODE>"rwd"</CODE> that is translated into a <CODE>$uShare</CODE> value.  <CODE>"rw"</CODE> is
  347. the default.
  348. <P><CODE>$uShare</CODE> should be an unsigned value having zero or more of the
  349. following bits set:  <CODE>FILE_SHARE_READ</CODE>, <CODE>FILE_SHARE_WRITE</CODE>, and
  350. <CODE>FILE_SHARE_DELETE</CODE>.  <CODE>FILE_SHARE_READ|FILE_SHARE_WRITE</CODE> is the
  351. default.</P>
  352. <P></P></DL>
  353. <P>Examples:</P>
  354. <PRE>
  355.     $hFlop= createFile( "//./A:", "r", "r" )
  356.       or  die "Can't prevent others from writing to floppy: $^E\n";
  357.     $hDisk= createFile( "//./C:", "rw ke", "" )
  358.       or  die "Can't get exclusive access to C: $^E\n";
  359.     $hDisk= createFile( $sFilePath, "ke",
  360.       { Access=>FILE_READ_ATTRIBUTES } )
  361.       or  die "Can't read attributes of $sFilePath: $^E\n";
  362.     $hTemp= createFile( "$ENV{Temp}/temp.$$", "wn", "",
  363.       { Attributes=>"hst", Flags=>FILE_FLAG_DELETE_ON_CLOSE() } )
  364.       or  die "Can't create temporary file, temp.$$: $^E\n";</PRE>
  365. <DT><STRONG><A NAME="item_getLogicalDrives">getLogicalDrives</A></STRONG><BR>
  366. <DD>
  367. <DT><STRONG><CODE>@roots= getLogicalDrives()</CODE></STRONG><BR>
  368. <DD>
  369. Returns the paths to the root directories of all logical drives
  370. currently defined.  This includes all types of drive lettters, such
  371. as floppies, CD-ROMs, hard disks, and network shares.  A typical
  372. return value on a poorly equipped computer would be <CODE>("A:\\","C:\\")</CODE>.
  373. <P></P>
  374. <DT><STRONG><A NAME="item_CloseHandle">CloseHandle</A></STRONG><BR>
  375. <DD>
  376. <DT><STRONG><CODE>CloseHandle( $hObject )</CODE></STRONG><BR>
  377. <DD>
  378. Closes a Win32 native handle, such as one opened via <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A>. 
  379. Like most routines, if it fails then it returns a false value and sets
  380. <CODE>$^E</CODE> to indicate the reason for the failure.   Returns a true value
  381. for success.
  382. <P></P>
  383. <DT><STRONG><A NAME="item_CopyFile">CopyFile</A></STRONG><BR>
  384. <DD>
  385. <DT><STRONG><CODE>CopyFile( $sOldFileName, $sNewFileName, $bFailIfExists )</CODE></STRONG><BR>
  386. <DD>
  387. <CODE>$sOldFileName</CODE> is the path to the file to be copied.  <CODE>$sNewFileName</CODE>
  388. is the path to where the file should be copied.  Note that you can &NOT;
  389. just specify a path to a directory in <CODE>$sNewFileName</CODE> to copy the
  390. file to that directory using the same file name.
  391. <P>If <CODE>$bFailIfExists</CODE> is true and <CODE>$sNewFileName</CODE> is the path to a
  392. file that already exists, then <A HREF="#item_CopyFile"><CODE>CopyFile</CODE></A> will fail.  If
  393. <CODE>$bFailIfExists</CODE> is falsea, then the copy of the <CODE>$sOldFileNmae</CODE>
  394. file will overwrite the <CODE>$sNewFileName</CODE> file if it already exists.</P>
  395. <P></P>
  396. <DT><STRONG><A NAME="item_CreateFile">CreateFile</A></STRONG><BR>
  397. <DD>
  398. <DT><STRONG><CODE>$hObject= CreateFile( $sPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )</CODE></STRONG><BR>
  399. <DD>
  400. On failure, <CODE>$hObject</CODE> gets set to a false value and <CODE>$^E</CODE> is set
  401. to the reason for the failure.  Otherwise, <CODE>$hObject</CODE> gets set to
  402. a Win32 native file handle which is alwasy a true value [returns
  403. <CODE>"0 but true"</CODE> in the impossible case of the handle having a value
  404. of <CODE>0</CODE>].
  405. <P><CODE>$sPath</CODE> is the path to the file [or device, etc.] to be opened.</P>
  406. <P><CODE>$sPath</CODE> can use <CODE>"/"</CODE> or <CODE>"\\"</CODE> as path delimiters and can even
  407. mix the two.  We will usually only use <CODE>"/"</CODE> in our examples since
  408. using <CODE>"\\"</CODE> is usually harder to read.</P>
  409. <P>Under Windows NT, <CODE>$sPath</CODE> can start with <CODE>"//?/"</CODE> to allow the use
  410. of paths longer than <CODE>MAX_PATH</CODE> [for UNC paths, replace the leading
  411. <CODE>"//"</CODE> with <CODE>"//?/UNC/"</CODE>, as in <CODE>"//?/UNC/Server/Share/Dir/File.Ext"</CODE>].</P>
  412. <P><CODE>$sPath</CODE> can start with <CODE>"//./"</CODE> to indicate that the rest of the path
  413. is the name of a ``DOS device.''  You can use <A HREF="#item_QueryDosDevice"><CODE>QueryDosDevice</CODE></A> to list
  414. all current DOS devices and can add or delete them with <A HREF="#item_DefineDosDevice"><CODE>DefineDosDevice</CODE></A>.</P>
  415. <P>The most common such DOS devices include:</P>
  416. <DL>
  417. <DT><STRONG><A NAME="item_%22%2F%2F%2E%2FPhysicalDrive0%22"><CODE>"//./PhysicalDrive0"</CODE></A></STRONG><BR>
  418. <DD>
  419. Your entire first hard disk.  Doesn't work under Windows 95.  This
  420. allows you to read or write raw sectors of your hard disk and to use
  421. <A HREF="#item_DeviceIoControl"><CODE>DeviceIoControl</CODE></A> to perform miscellaneous queries and operations
  422. to the hard disk.   Writing raw sectors and certain other operations
  423. can seriously damage your files or the function of your computer.
  424. <P>Locking this for exclusive access [by specifying <CODE>0</CODE> for <CODE>$uShare</CODE>]
  425. doesn't prevent access to the partitions on the disk nor their file
  426. systems.  So other processes can still access any raw sectors within
  427. a partition and can use the file system on the disk as usual.</P>
  428. <P></P>
  429. <DT><STRONG><A NAME="item_%22%2F%2F%2E%2FC%3A%22"><CODE>"//./C:"</CODE></A></STRONG><BR>
  430. <DD>
  431. Your <EM>C:</EM> partition.  Doesn't work under Windows 95.  This allows
  432. you to read or write raw sectors of that partition and to use
  433. <A HREF="#item_DeviceIoControl"><CODE>DeviceIoControl</CODE></A> to perform miscellaneous queries and operations
  434. to the sector.  Writing raw sectors and certain other operations
  435. can seriously damage your files or the function of your computer.
  436. <P>Locking this for exclusive access doesn't prevent access to the
  437. physical drive that the partition is on so other processes can
  438. still access the raw sectors that way.  Locking this for exclusive
  439. access &does; prevent other processes from opening the same raw
  440. partition and &does; prevent access to the file system on it.  It
  441. even prevents the current process from accessing the file system on
  442. that partition.</P>
  443. <P></P>
  444. <DT><STRONG><A NAME="item_%22%2F%2F%2E%2FA%3A%22"><CODE>"//./A:"</CODE></A></STRONG><BR>
  445. <DD>
  446. The raw floppy disk.  Doesn't work under Windows 95.  This allows you
  447. to read or write raw sectors of the floppy disk and to use
  448. <A HREF="#item_DeviceIoControl"><CODE>DeviceIoControl</CODE></A> to perform miscellaneous queries and operations
  449. to the floopy disk or drive.
  450. <P>Locking this for exclusive access prevents all access to the floppy.</P>
  451. <P></P>
  452. <DT><STRONG><A NAME="item_%22%2F%2F%2E%2FPIPE%2FPipeName%22"><CODE>"//./PIPE/PipeName"</CODE></A></STRONG><BR>
  453. <DD>
  454. A named pipe, created via <CODE>CreateNamedPipe</CODE>.
  455. <P></P></DL>
  456. <P><CODE>$uAccess</CODE> is an unsigned value with bits set indicating the
  457. type of access desired.  Usually either <CODE>0</CODE> [``query'' access],
  458. <CODE>GENERIC_READ</CODE>, <CODE>GENERIC_WRITE</CODE>, <CODE>GENERIC_READ|GENERIC_WRITE</CODE>,
  459. or <CODE>GENERIC_ALL</CODE>.  More specific types of access can be specified,
  460. such as <CODE>FILE_APPEND_DATA</CODE> or <CODE>FILE_READ_EA</CODE>.</P>
  461. <P><CODE>$uShare</CODE> controls how the file is shared, that is, whether other
  462. processes can have read, write, and/or delete access to the file while
  463. we have it opened.  <CODE>$uShare</CODE> is an unsigned value with zero or more
  464. of these bits set:  <CODE>FILE_SHARE_READ</CODE>, <CODE>FILE_SHARE_WRITE</CODE>, and
  465. <CODE>FILE_SHARE_DELETE</CODE>.</P>
  466. <P>If another process currently has read, write, and/or delete access to
  467. the file and you don't allow that level of sharing, then your call to
  468. <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A> will fail.  If you requested read, write, and/or delete
  469. access and another process already has the file open but doesn't allow
  470. that level of sharing, thenn your call to <A HREF="#item_createFile"><CODE>createFile</CODE></A> will fail.  Once
  471. you have the file open, if another process tries to open it with read,
  472. write, and/or delete access and you don't allow that level of sharing,
  473. then that process won't be allowed to open the file.</P>
  474. <P><CODE>$pSecAttr</CODE> should either be <CODE>[]</CODE> [for <CODE>NULL</CODE>] or a
  475. <CODE>SECURITY_ATTRIBUTES</CODE> data structure packed into a string.
  476. For example, if <CODE>$pSecDesc</CODE> contains a <CODE>SECURITY_DESCRIPTOR</CODE>
  477. structure packed into a string, perhaps via:</P>
  478. <PRE>
  479.     RegGetKeySecurity( $key, 4, $pSecDesc, 1024 );</PRE>
  480. <P>then you can set <CODE>$pSecAttr</CODE> via:</P>
  481. <PRE>
  482.     $pSecAttr= pack( "L P i", 12, $pSecDesc, $bInheritHandle );</PRE>
  483. <P><CODE>$uCreate</CODE> is one of the following values:  <CODE>OPEN_ALWAYS</CODE>,
  484. <CODE>OPEN_EXISTING</CODE>, <CODE>TRUNCATE_EXISTING</CODE>, <CODE>CREATE_ALWAYS</CODE>, and
  485. <CODE>CREATE_NEW</CODE>.</P>
  486. <P><CODE>$uFlags</CODE> is an unsigned value with zero or more bits set indicating
  487. attributes to associate with the file [<CODE>FILE_ATTRIBUTE_*</CODE> values] or
  488. special options [<CODE>FILE_FLAG_*</CODE> values].</P>
  489. <P>If opening the client side of a named pipe, then you can also set
  490. <CODE>$uFlags</CODE> to include <CODE>SECURITY_SQOS_PRESENT</CODE> along with one of the
  491. other <CODE>SECURITY_*</CODE> constants to specify the security quality of
  492. service to be used.</P>
  493. <P><CODE>$hModel</CODE> is <CODE>0</CODE> [or <CODE>[]</CODE>, both of which mean <CODE>NULL</CODE>] or a Win32
  494. native handle opened  with <CODE>GENERIC_READ</CODE> access to a model file from
  495. which file attributes and extended attributes are to be copied if a
  496. new file gets created.</P>
  497. <P>Examples:</P>
  498. <PRE>
  499.     $hFlop= CreateFile( "//./A:", GENERIC_READ(),
  500.       FILE_SHARE_READ(), [], OPEN_EXISTING(), 0, [] )
  501.       or  die "Can't prevent others from writing to floppy: $^E\n";
  502.     $hDisk= createFile( $sFilePath, FILE_READ_ATTRIBUTES(),
  503.       FILE_SHARE_READ()|FILE_SHARE_WRITE(), [], OPEN_EXISTING(), 0, [] )
  504.       or  die "Can't read attributes of $sFilePath: $^E\n";
  505.     $hTemp= createFile( "$ENV{Temp}/temp.$$", GENERIC_WRITE(), 0,
  506.       CREATE_NEW(), FILE_FLAG_DELETE_ON_CLOSE()|attrLetsToBits("hst"), [] )
  507.       or  die "Can't create temporary file, temp.$$: $^E\n";</PRE>
  508. <DT><STRONG><A NAME="item_DefineDosDevice">DefineDosDevice</A></STRONG><BR>
  509. <DD>
  510. <DT><STRONG><CODE>DefineDosDevice( $uFlags, $sDosDeviceName, $sTargetPath )</CODE></STRONG><BR>
  511. <DD>
  512. <CODE>$sDosDeviceName</CODE> is the name of a DOS device for which we'd like
  513. to add or delete a definition.
  514. <P><CODE>$uFlags</CODE> is an unsigned value with zero or more of the following
  515. bits set:</P>
  516. <DL>
  517. <DT><STRONG><A NAME="item_DDD_RAW_TARGET_PATH"><CODE>DDD_RAW_TARGET_PATH</CODE></A></STRONG><BR>
  518. <DD>
  519. Indicates that <CODE>$sTargetPath</CODE> will be a raw Windows NT object name. 
  520. This usually means that <CODE>$sTargetPath</CODE> starts with <CODE>"\\Devices\\"</CODE>. 
  521. Note that you cannot use <CODE>"/"</CODE> in place of <CODE>"\\"</CODE> in raw target path
  522. names.
  523. <P></P>
  524. <DT><STRONG><A NAME="item_DDD_REMOVE_DEFINITION"><CODE>DDD_REMOVE_DEFINITION</CODE></A></STRONG><BR>
  525. <DD>
  526. Requests that a definition be deleted.  If <CODE>$sTargetPath</CODE> is
  527. <CODE>[]</CODE> [for <CODE>NULL</CODE>], then the most recently added definition for
  528. <CODE>$sDosDeviceName</CODE> is removed.  Otherwise the most recently added
  529. definition matching <CODE>$sTargetPath</CODE> is removed.
  530. <P>If the last definition is removed, then the DOS device name is also
  531. deleted.</P>
  532. <P></P>
  533. <DT><STRONG><A NAME="item_DDD_EXACT_MATCH_ON_REMOVE"><CODE>DDD_EXACT_MATCH_ON_REMOVE</CODE></A></STRONG><BR>
  534. <DD>
  535. When deleting a definition, this bit causes each <CODE>$sTargetPath</CODE> to
  536. be compared to the full-length definition when searching for the most
  537. recently added match.  If this bit is not set, then <CODE>$sTargetPath</CODE>
  538. only needs to match a prefix of the definition.
  539. <P></P></DL>
  540. <P><CODE>$sTargetPath</CODE> is the DOS device's specific definition that you wish
  541. to add or delete.  For <A HREF="#item_DDD_RAW_TARGET_PATH"><CODE>DDD_RAW_TARGET_PATH</CODE></A>, these usually start
  542. with <CODE>"\\Devices\\"</CODE>.  If the <A HREF="#item_DDD_RAW_TARGET_PATH"><CODE>DDD_RAW_TARGET_PATH</CODE></A> bit is not
  543. set, then <CODE>$sTargetPath</CODE> is just an ordinary path to some file or
  544. directory, providing the functionality of the <STRONG>subst</STRONG> command.</P>
  545. <DT><STRONG><A NAME="item_DeleteFile">DeleteFile</A></STRONG><BR>
  546. <DD>
  547. <DT><STRONG><CODE>DeleteFile( $sFileName )</CODE></STRONG><BR>
  548. <DD>
  549. Deletes the named file.  Compared to Perl's <A HREF="../../../lib/Pod/perlfunc.html#item_unlink"><CODE>unlink</CODE></A>, <A HREF="#item_DeleteFile"><CODE>DeleteFile</CODE></A>
  550. has the advantage of not deleting read-only files.  For &some;
  551. versions of Perl, <A HREF="../../../lib/Pod/perlfunc.html#item_unlink"><CODE>unlink</CODE></A> silently calls <A HREF="../../../lib/Pod/perlfunc.html#item_chmod"><CODE>chmod</CODE></A> whether it needs
  552. to or not before deleting the file so that files that you have
  553. protected by marking them as read-only are not always protected from
  554. Perl's <A HREF="../../../lib/Pod/perlfunc.html#item_unlink"><CODE>unlink</CODE></A>.
  555. <P></P>
  556. <DT><STRONG><A NAME="item_DeviceIoControl">DeviceIoControl</A></STRONG><BR>
  557. <DD>
  558. <DT><STRONG><CODE>DeviceIoControl( $hDevice, $uIoControlCode, $pInBuf, $lInBuf, $opOutBuf, $lOutBuf, $olRetBytes, $pOverlapped )</CODE></STRONG><BR>
  559. <DD>
  560. <CODE>$hDevice</CODE> is a Win32 native file handle to a device [return value
  561. from <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A>].
  562. <P><CODE>$uIoControlCode</CODE> is an unsigned value [a <CODE>IOCTL_*</CODE> constant]
  563. indicating the type query or other operation to be performed.</P>
  564. <P><CODE>$pInBuf</CODE> is <CODE>[]</CODE> [for <CODE>NULL</CODE>] or a data structure packed into a string.
  565. The type of data structure depends on the <CODE>$uIoControlCode</CODE> value.
  566. <CODE>$lInBuf</CODE> is <CODE>0</CODE> or the length of the structure in <CODE>$pInBuf</CODE>.  If 
  567. <CODE>$pInBuf</CODE> is not <CODE>[]</CODE> and <CODE>$lInBuf</CODE> is <CODE>0</CODE>, then <CODE>$lInBuf</CODE> will
  568. automatically be set to <A HREF="../../../lib/Pod/perlfunc.html#item_length"><CODE>length($pInBuf)</CODE></A> for you.</P>
  569. <P><CODE>$opOutBuf</CODE> is <CODE>[]</CODE> [for <CODE>NULL</CODE>] or will be set to contain a
  570. returned data structure packed into a string.  <CODE>$lOutBuf</CODE> indicates
  571. how much space to allocate in <CODE>$opOutBuf</CODE> for <A HREF="#item_DeviceIoControl"><CODE>DeviceIoControl</CODE></A> to
  572. store the data structure.  If <CODE>$lOutBuf</CODE> is a number and <CODE>$opOutBuf</CODE>
  573. already has a buffer allocated for it that is larger than <CODE>$lOutBuf</CODE>
  574. bytes, then this larger buffer size will be passed to <A HREF="#item_DeviceIoControl"><CODE>DeviceIoControl</CODE></A>.
  575. To force a specific buffer size to be passed to <A HREF="#item_DeviceIoControl"><CODE>DeviceIoControl</CODE></A>,
  576. prepend a <CODE>"="</CODE> to the front of <CODE>$lOutBuf</CODE>.</P>
  577. <P><CODE>$olRetBytes</CODE> is <CODE>[]</CODE> or is a scalar to receive the number of bytes
  578. written to <CODE>$opOutBuf</CODE>.  Even when <CODE>$olRetBytes</CODE> is <CODE>[]</CODE>, a valid
  579. pointer to a <CODE>DWORD</CODE> [and not <CODE>NULL</CODE>] is passed to <A HREF="#item_DeviceIoControl"><CODE>DeviceIoControl</CODE></A>.
  580. In this case, <CODE>[]</CODE> just means that you don't care about the value
  581. that might be written to <CODE>$olRetBytes</CODE>, which is usually the case
  582. since you can usually use <A HREF="../../../lib/Pod/perlfunc.html#item_length"><CODE>length($opOutBuf)</CODE></A> instead.</P>
  583. <P><CODE>$pOverlapped</CODE> is <CODE>[]</CODE> or is a <CODE>OVERLAPPED</CODE> structure packed into
  584. a string.  This is only useful if <CODE>$hDevice</CODE> was opened with the
  585. <CODE>FILE_FLAG_OVERLAPPED</CODE> flag set.</P>
  586. <P></P>
  587. <DT><STRONG><A NAME="item_FdGetOsFHandle">FdGetOsFHandle</A></STRONG><BR>
  588. <DD>
  589. <DT><STRONG><CODE>$hNativeHandle= FdGetOsFHandle( $ivFd )</CODE></STRONG><BR>
  590. <DD>
  591. <A HREF="#item_FdGetOsFHandle"><CODE>FdGetOsFHandle</CODE></A> simply calls <CODE>_get_osfhandle()</CODE>.  It was renamed
  592. to better fit in with the rest the function names of this module,
  593. in particular to distinguish it from <A HREF="#item_GetOsFHandle"><CODE>GetOsFHandle</CODE></A>.  It takes an
  594. integer file descriptor [as from <A HREF="../../../lib/Pod/perlfunc.html#item_fileno"><CODE>fileno</CODE></A>] and return the Win32
  595. native file handle assocatiated with that file descriptor.
  596. <P>When you call Perl's <A HREF="../../../lib/Pod/perlfunc.html#item_open"><CODE>open</CODE></A> to set a Perl file handle [like <CODE>STDOUT</CODE>],
  597. Perl calls C's <CODE>fopen</CODE> to set a stdio <CODE>FILE *</CODE>.  C's <CODE>fopen</CODE> calls
  598. something like Unix's <A HREF="../../../lib/Pod/perlfunc.html#item_open"><CODE>open</CODE></A>, that is, Win32's <CODE>_sopen</CODE>, to get an
  599. integer file descriptor [where 0 is for <CODE>STDIN</CODE>, 1 for <CODE>STDOUT</CODE>, etc.].
  600. Win32's <CODE>_sopen</CODE> calls <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A> to set a <CODE>HANDLE</CODE>, a Win32 native
  601. file handle.  So every Perl file handle [like <CODE>STDOUT</CODE>] has an integer
  602. file descriptor associated with it that you can get via <A HREF="../../../lib/Pod/perlfunc.html#item_fileno"><CODE>fileno</CODE></A>.  And,
  603. under Win32, every file descriptor has a Win32 native file handle
  604. associated with it.  <A HREF="#item_FdGetOsFHandle"><CODE>FdGetOsFHandle</CODE></A> lets you get access to that.</P>
  605. <P></P>
  606. <DT><STRONG><A NAME="item_GetDriveType">GetDriveType</A></STRONG><BR>
  607. <DD>
  608. <DT><STRONG><CODE>$uDriveType= GetDriveType( $sRootPath )</CODE></STRONG><BR>
  609. <DD>
  610. Takes a string giving the path to the root directory of a file system
  611. [called a ``drive'' because every file system is assigned a ``drive letter'']
  612. and returns an unsigned value indicating the type of drive the file
  613. system is on.  The return value should be one of:
  614. <DL>
  615. <DT><STRONG><A NAME="item_DRIVE_UNKNOWN"><CODE>DRIVE_UNKNOWN</CODE></A></STRONG><BR>
  616. <DD>
  617. None of the following.
  618. <P></P>
  619. <DT><STRONG><A NAME="item_DRIVE_NO_ROOT_DIR"><CODE>DRIVE_NO_ROOT_DIR</CODE></A></STRONG><BR>
  620. <DD>
  621. A ``drive'' that does not have a file system.  This can be a drive letter
  622. that hasn't been defined or a drive letter assigned to a partition
  623. that hasn't been formatted yet.
  624. <P></P>
  625. <DT><STRONG><A NAME="item_DRIVE_REMOVABLE"><CODE>DRIVE_REMOVABLE</CODE></A></STRONG><BR>
  626. <DD>
  627. A floppy diskette drive or other removable media drive, but not a CD-ROM
  628. drive.
  629. <P></P>
  630. <DT><STRONG><A NAME="item_DRIVE_FIXED"><CODE>DRIVE_FIXED</CODE></A></STRONG><BR>
  631. <DD>
  632. An ordinary hard disk partition.
  633. <P></P>
  634. <DT><STRONG><A NAME="item_DRIVE_REMOTE"><CODE>DRIVE_REMOTE</CODE></A></STRONG><BR>
  635. <DD>
  636. A network share.
  637. <P></P>
  638. <DT><STRONG><A NAME="item_DRIVE_CDROM"><CODE>DRIVE_CDROM</CODE></A></STRONG><BR>
  639. <DD>
  640. A CD-ROM drive.
  641. <P></P>
  642. <DT><STRONG><A NAME="item_DRIVE_RAMDISK"><CODE>DRIVE_RAMDISK</CODE></A></STRONG><BR>
  643. <DD>
  644. A ``ram disk'' or memory-resident virtual file system used for high-speed
  645. access to small amounts of temporary file space.
  646. <P></P></DL>
  647. <DT><STRONG><A NAME="item_GetFileType">GetFileType</A></STRONG><BR>
  648. <DD>
  649. <DT><STRONG><CODE>$uFileType= GetFileType( $hFile )</CODE></STRONG><BR>
  650. <DD>
  651. Takes a Win32 native file handle and returns a <CODE>FILE_TYPE_*</CODE> constant
  652. indicating the type of the file opened on that handle:
  653. <DL>
  654. <DT><STRONG><A NAME="item_FILE_TYPE_UNKNOWN"><CODE>FILE_TYPE_UNKNOWN</CODE></A></STRONG><BR>
  655. <DD>
  656. None of the below.  Often a special device.
  657. <P></P>
  658. <DT><STRONG><A NAME="item_FILE_TYPE_DISK"><CODE>FILE_TYPE_DISK</CODE></A></STRONG><BR>
  659. <DD>
  660. An ordinary disk file.
  661. <P></P>
  662. <DT><STRONG><A NAME="item_FILE_TYPE_CHAR"><CODE>FILE_TYPE_CHAR</CODE></A></STRONG><BR>
  663. <DD>
  664. What Unix would call a ``character special file'', that is, a device that
  665. works on characters streams such as a printer port or a console.
  666. <P></P>
  667. <DT><STRONG><A NAME="item_FILE_TYPE_PIPE"><CODE>FILE_TYPE_PIPE</CODE></A></STRONG><BR>
  668. <DD>
  669. Either a named or anonymous pipe.
  670. <P></P></DL>
  671. <DT><STRONG><A NAME="item_GetLogicalDrives">GetLogicalDrives</A></STRONG><BR>
  672. <DD>
  673. <DT><STRONG><CODE>$uDriveBits= GetLogicalDrives()</CODE></STRONG><BR>
  674. <DD>
  675. Returns an unsigned value with one bit set for each drive letter currently
  676. defined.  If ``A:'' is currently a valid drive letter, then the <CODE>1</CODE> bit
  677. will be set in <CODE>$uDriveBits</CODE>.  If ``B:'' is valid, then the <CODE>2</CODE> bit will
  678. be set.  If ``Z:'' is valid, then the <CODE>2**26</CODE> [<CODE>0x4000000</CODE>] bit will be
  679. set.
  680. <P></P>
  681. <DT><STRONG><A NAME="item_GetLogicalDriveStrings">GetLogicalDriveStrings</A></STRONG><BR>
  682. <DD>
  683. <DT><STRONG><CODE>$olOutLength= GetLogicalDriveStrings( $lBufSize, $osBuffer )</CODE></STRONG><BR>
  684. <DD>
  685. For each currently defined drive letter, a <CODE>'\0'</CODE>-terminated string
  686. of the path to the root of its file system is constructed.  All of
  687. these strings are concatenated into single larger string and an extra
  688. terminating <CODE>'\0'</CODE> is added.  This larger string is returned in
  689. <CODE>$osBuffer</CODE>.  Note that this includes drive letters that have been
  690. defined but that have not file system, such as drive letters assigned
  691. to unformatted partitions.
  692. <P><CODE>$lBufSize</CODE> is the size of the buffer to allocate to store this
  693. list of strings.  <CODE>26*4+1</CODE> is always sufficient and should usually
  694. be used.</P>
  695. <P><CODE>$osBuffer</CODE> is a scalar to be set to contain the constructed string.</P>
  696. <P><CODE>$olOutLength</CODE> is the number of bytes actually written to <CODE>$osBuffer</CODE>
  697. but <A HREF="../../../lib/Pod/perlfunc.html#item_length"><CODE>length($osBuffer)</CODE></A> can also be used to determine this.</P>
  698. <P>For example, on a poorly equipped computer,</P>
  699. <PRE>
  700.     GetLogicalDriveStrings( 4*26+1, $osBuffer );</PRE>
  701. <P>might set <CODE>$osBuffer</CODE> to <CODE>"A:\\\0C:\\\0\0"</CODE> [which is the same
  702. as <CODE>join "", 'A',':','\\','\0', 'C',':','\\','\0', '\0'</CODE>].</P>
  703. <P></P>
  704. <DT><STRONG><A NAME="item_GetOsFHandle">GetOsFHandle</A></STRONG><BR>
  705. <DD>
  706. <DT><STRONG><CODE>$hNativeHandle= GetOsFHandle( FILE )</CODE></STRONG><BR>
  707. <DD>
  708. Takes a Perl file handle [like <CODE>STDIN</CODE>] and returns the Win32 native
  709. file handle associated with it.  See <A HREF="#item_FdGetOsFHandle"><CODE>FdGetOsFHandle</CODE></A> for more information.
  710. <P></P>
  711. <DT><STRONG><A NAME="item_GetVolumeInformation">GetVolumeInformation</A></STRONG><BR>
  712. <DD>
  713. <DT><STRONG><CODE>GetVolumeInformation( $sRootPath, $osVolName, $lVolName, $ouSerialNum, $ouMaxNameLen, $ouFsFlags, $osFsType, $lFsType )</CODE></STRONG><BR>
  714. <DD>
  715. Gets information about a file system volume.
  716. <P><CODE>$sRootPath</CODE> is a string specifying the path to the root of the file system,
  717. for example, <CODE>"C:/"</CODE>.</P>
  718. <P><CODE>$osVolName</CODE> is a scalar to be set to the string representing the
  719. volume name, also called the file system label.  <CODE>$lVolName</CODE> is the
  720. number of bytes to allocate for the <CODE>$osVolName</CODE> buffer [see
  721. <A HREF="#buffer sizes">Buffer Sizes</A> for more information].</P>
  722. <P><CODE>$ouSerialNum</CODE> is <CODE>[]</CODE> [for <CODE>NULL</CODE>] or will be set to the numeric
  723. value of the volume's serial number.</P>
  724. <P><CODE>$ouMaxNameLen</CODE> is <CODE>[]</CODE> [for <CODE>NULL</CODE>] or will be set to the maximum
  725. length allowed for a file name or directory name within the file system.</P>
  726. <P><CODE>$osFsType</CODE> is a scalar to be set to the string representing the
  727. file system type, such as <CODE>"FAT"</CODE> or <CODE>"NTFS"</CODE>.  <CODE>$lFsType</CODE> is the
  728. number of bytes to allocate for the <CODE>$osFsType</CODE> buffer [see
  729. <A HREF="#buffer sizes">Buffer Sizes</A> for more information].</P>
  730. <P><CODE>$ouFsFlags</CODE> is <CODE>[]</CODE> [for <CODE>NULL</CODE>] or will be set to an unsigned integer
  731. with bits set indicating properties of the file system:</P>
  732. <DL>
  733. <DT><STRONG><A NAME="item_FS_CASE_IS_PRESERVED"><CODE>FS_CASE_IS_PRESERVED</CODE></A></STRONG><BR>
  734. <DD>
  735. The file system preserves the case of file names [usually true].
  736. That is, it doesn't change the case of file names such as forcing
  737. them to upper- or lower-case.
  738. <P></P>
  739. <DT><STRONG><A NAME="item_FS_CASE_SENSITIVE"><CODE>FS_CASE_SENSITIVE</CODE></A></STRONG><BR>
  740. <DD>
  741. The file system supports the ability to not ignore the case of file
  742. names [but might ignore case the way you are using it].  That is, the
  743. file system has the ability to force you to get the letter case of a
  744. file's name exactly right to be able to open it.  This is true for
  745. ``NTFS'' file systems, even though case in file names is usually still
  746. ignored.
  747. <P></P>
  748. <DT><STRONG><A NAME="item_FS_UNICODE_STORED_ON_DISK"><CODE>FS_UNICODE_STORED_ON_DISK</CODE></A></STRONG><BR>
  749. <DD>
  750. The file system perserves Unicode in file names [true for ``NTFS''].
  751. <P></P>
  752. <DT><STRONG><A NAME="item_FS_PERSISTENT_ACLS"><CODE>FS_PERSISTENT_ACLS</CODE></A></STRONG><BR>
  753. <DD>
  754. The file system supports setting Access Control Lists on files [true
  755. for ``NTFS''].
  756. <P></P>
  757. <DT><STRONG><A NAME="item_FS_FILE_COMPRESSION"><CODE>FS_FILE_COMPRESSION</CODE></A></STRONG><BR>
  758. <DD>
  759. The file system supports compression on a per-file basis [true for
  760. ``NTFS''].
  761. <P></P>
  762. <DT><STRONG><A NAME="item_FS_VOL_IS_COMPRESSED"><CODE>FS_VOL_IS_COMPRESSED</CODE></A></STRONG><BR>
  763. <DD>
  764. The entire file system is compressed such as via ``DoubleSpace''.
  765. <P></P></DL>
  766. <DT><STRONG><A NAME="item_IsRecognizedPartition">IsRecognizedPartition</A></STRONG><BR>
  767. <DD>
  768. <DT><STRONG><CODE>IsRecognizedPartition( $ivPartitionType )</CODE></STRONG><BR>
  769. <DD>
  770. Takes a partition type and returns whether that partition type is
  771. supported under Win32.  <CODE>$ivPartitonType</CODE> is an integer value as from
  772. the operating system byte of a hard disk's DOS-compatible partition
  773. table [that is, a partition table for x86-based Win32, not, for
  774. example, one used with Windows NT for Alpha processors].  For example,
  775. the <CODE>PartitionType</CODE> member of the <CODE>PARTITION_INFORMATION</CODE> structure.
  776. <P>Common values for <CODE>$ivPartitionType</CODE> include <CODE>PARTITION_FAT_12==1</CODE>,
  777. <CODE>PARTITION_FAT_16==4</CODE>, <CODE>PARTITION_EXTENDED==5</CODE>, <CODE>PARTITION_FAT32==0xB</CODE>.</P>
  778. <P></P>
  779. <DT><STRONG><A NAME="item_IsContainerPartition">IsContainerPartition</A></STRONG><BR>
  780. <DD>
  781. <DT><STRONG><CODE>IsContainerPartition( $ivPartitionType )</CODE></STRONG><BR>
  782. <DD>
  783. Takes a partition type and returns whether that partition is a
  784. ``container'' partition that is supported under Win32, that is, whether
  785. it is an ``extended'' partition that can contain ``logical'' partitions. 
  786. <CODE>$ivPartitonType</CODE> is as for <A HREF="#item_IsRecognizedPartition"><CODE>IsRecognizedPartition</CODE></A>.
  787. <P></P>
  788. <DT><STRONG><A NAME="item_MoveFile">MoveFile</A></STRONG><BR>
  789. <DD>
  790. <DT><STRONG><CODE>MoveFile( $sOldName, $sNewName )</CODE></STRONG><BR>
  791. <DD>
  792. Renames a file or directory.  <CODE>$sOldName</CODE> is the name of the existing
  793. file or directory that is to be renamed.  <CODE>$sNewName</CODE> is the new name
  794. to give the file or directory.
  795. <P>Files can be ``renamed'' between file systems and the file contents and
  796. some attributes will be moved.  Directories can only be renamed within
  797. one file system.  If there is already a file or directory named
  798. <CODE>$sNewName</CODE>, then <A HREF="#item_MoveFile"><CODE>MoveFile</CODE></A> will fail.</P>
  799. <P></P>
  800. <DT><STRONG><A NAME="item_MoveFileEx">MoveFileEx</A></STRONG><BR>
  801. <DD>
  802. <DT><STRONG><CODE>MoveFileEx( $sOldName, $sNewName, $uFlags )</CODE></STRONG><BR>
  803. <DD>
  804. Renames a file or directory.  <CODE>$sOldName</CODE> is the name of the existing
  805. file or directory that is to be renamed.  <CODE>$sNewName</CODE> is the new name
  806. to give the file or directory.
  807. <P><CODE>$uFlags</CODE> is an unsigned value with zero or more of the following bits set:</P>
  808. <DL>
  809. <DT><STRONG><A NAME="item_MOVEFILE_REPLACE_EXISTING"><CODE>MOVEFILE_REPLACE_EXISTING</CODE></A></STRONG><BR>
  810. <DD>
  811. If this bit is set and a file or directory named <CODE>$sNewName</CODE> already
  812. exists, then it will be replaced by <CODE>$sOldName</CODE>.  If this bit is not
  813. set then <A HREF="#item_MoveFileEx"><CODE>MoveFileEx</CODE></A> will fail rather than replace an existing
  814. <CODE>$sNewName</CODE>.
  815. <P></P>
  816. <DT><STRONG><A NAME="item_MOVEFILE_COPY_ALLOWED"><CODE>MOVEFILE_COPY_ALLOWED</CODE></A></STRONG><BR>
  817. <DD>
  818. Allows files [but not directories] to be moved between file systems
  819. by copying the <CODE>$sOldName</CODE> file data and some attributes to
  820. <CODE>$sNewName</CODE> and then deleting <CODE>$sOldName</CODE>.  If this bit is not set
  821. [or if <CODE>$sOldName</CODE> denotes a directory] and <CODE>$sNewName</CODE> refers to a
  822. different file system than <CODE>$sOldName</CODE>, then <A HREF="#item_MoveFileEx"><CODE>MoveFileEx</CODE></A> will fail.
  823. <P></P>
  824. <DT><STRONG><A NAME="item_MOVEFILE_DELAY_UNTIL_REBOOT"><CODE>MOVEFILE_DELAY_UNTIL_REBOOT</CODE></A></STRONG><BR>
  825. <DD>
  826. Preliminary verifications are made and then an entry is added to the
  827. Registry to cause the rename [or delete] operation to be done the
  828. next time this copy of the operating system is booted [right after
  829. any automatic file system checks have completed].  This is not
  830. supported under Windows 95.
  831. <P>When this bit is set, <CODE>$sNewName</CODE> can be <CODE>[]</CODE> [for <CODE>NULL</CODE>] to
  832. indicate that <CODE>$sOldName</CODE> should be deleted during the next boot
  833. rather than renamed.</P>
  834. <P>Setting both the <A HREF="#item_MOVEFILE_COPY_ALLOWED"><CODE>MOVEFILE_COPY_ALLOWED</CODE></A> and
  835. <A HREF="#item_MOVEFILE_DELAY_UNTIL_REBOOT"><CODE>MOVEFILE_DELAY_UNTIL_REBOOT</CODE></A> bits will cause <A HREF="#item_MoveFileEx"><CODE>MoveFileEx</CODE></A> to fail.</P>
  836. <P></P>
  837. <DT><STRONG><A NAME="item_MOVEFILE_WRITE_THROUGH"><CODE>MOVEFILE_WRITE_THROUGH</CODE></A></STRONG><BR>
  838. <DD>
  839. Ensures that <A HREF="#item_MoveFileEx"><CODE>MoveFileEx</CODE></A> won't return until the operation has
  840. finished and been flushed to disk.   This is not supported under
  841. Windows 95.  Only affects file renames to another file system,
  842. forcing a buffer flush at the end of the copy operation.
  843. <P></P></DL>
  844. <DT><STRONG><A NAME="item_OsFHandleOpen">OsFHandleOpen</A></STRONG><BR>
  845. <DD>
  846. <DT><STRONG><CODE>OsFHandleOpen( FILE, $hNativeHandle, $sMode )</CODE></STRONG><BR>
  847. <DD>
  848. Opens a Perl file handle based on an already open Win32 native
  849. file handle [much like C's <CODE>fdopen()</CODE> does with a file descriptor].
  850. <P><CODE>FILE</CODE> is a Perl file handle [in any of the supported forms, a
  851. bareword, a string, a typeglob, or a reference to a typeglob] that
  852. will be opened.  If <CODE>FILE</CODE> is already open, it will automatically
  853. be closed before it is reopened.</P>
  854. <P><CODE>$hNativeHandle</CODE> is an open Win32 native file handle, probably the
  855. return value from <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A>.</P>
  856. <P><CODE>$sMode</CODE> is string of zero or more letters from <CODE>"rwatb"</CODE>.  These
  857. are translated into a combination <CODE>O_RDONLY</CODE> [<A HREF="#item_%22r%22"><CODE>"r"</CODE></A>], <CODE>O_WRONLY</CODE>
  858. [<A HREF="#item_%22w%22"><CODE>"w"</CODE></A>], <CODE>O_RDWR</CODE> [<CODE>"rw"</CODE>], <CODE>O_APPEND</CODE> [<A HREF="#item_%22a%22"><CODE>"a"</CODE></A>], <CODE>O_TEXT</CODE>
  859. [<A HREF="#item_%22t%22"><CODE>"t"</CODE></A>], and <CODE>O_BINARY</CODE> [<CODE>"b"</CODE>] flags [see the <A HREF="../../../lib/Fcntl.html">the Fcntl manpage</A> module]
  860. that is passed to <A HREF="#item_OsFHandleOpenFd"><CODE>OsFHandleOpenFd</CODE></A>.   Currently only <CODE>O_APPEND</CODE>
  861. and <CODE>O_TEXT</CODE> have any significance.</P>
  862. <P>Also, a <A HREF="#item_%22r%22"><CODE>"r"</CODE></A> and/or <A HREF="#item_%22w%22"><CODE>"w"</CODE></A> in <CODE>$sMode</CODE> is used to decide how the
  863. file descriptor is converted into a Perl file handle, even though this
  864. doesn't appear to make a difference.  One of the following is used:</P>
  865. <PRE>
  866.     open( FILE, "<&=".$ivFd )
  867.     open( FILE, ">&=".$ivFd )
  868.     open( FILE, "+<&=".$ivFd )</PRE>
  869. <P><A HREF="#item_OsFHandleOpen"><CODE>OsFHandleOpen</CODE></A> eventually calls the Win32-specific C routine
  870. <CODE>_open_osfhandle()</CODE> or Perl's ``improved'' version called
  871. <CODE>win32_open_osfhandle()</CODE>.  Prior to Perl5.005, C's
  872. <CODE>_open_osfhandle()</CODE> is called which will fail if
  873. <A HREF="#item_GetFileType"><CODE>GetFileType($hNativeHandle)</CODE></A> would return <A HREF="#item_FILE_TYPE_UNKNOWN"><CODE>FILE_TYPE_UNKNOWN</CODE></A>. 
  874. For Perl5.005 and later, <A HREF="#item_OsFHandleOpen"><CODE>OsFHandleOpen</CODE></A> calls
  875. <CODE>win32_open_osfhandle()</CODE> from the Perl DLL which doesn't have
  876. this restriction.</P>
  877. <P></P>
  878. <DT><STRONG><A NAME="item_OsFHandleOpenFd">OsFHandleOpenFd</A></STRONG><BR>
  879. <DD>
  880. <DT><STRONG><CODE>$ivFD= OsFHandleOpenFd( $hNativeHandle, $uMode )</CODE></STRONG><BR>
  881. <DD>
  882. Opens a file descriptor [<CODE>$ivFD</CODE>] based on an already open Win32
  883. native file handle, <CODE>$hNativeHandle</CODE>.  This just calls the
  884. Win32-specific C routine <CODE>_open_osfhandle()</CODE> or Perl's ``improved''
  885. version called <CODE>win32_open_osfhandle()</CODE>.  Prior to Perl5.005, C's
  886. <CODE>_open_osfhandle()</CODE> is called which will fail if
  887. <A HREF="#item_GetFileType"><CODE>GetFileType($hNativeHandle)</CODE></A> would return <A HREF="#item_FILE_TYPE_UNKNOWN"><CODE>FILE_TYPE_UNKNOWN</CODE></A>.  
  888. For Perl5.005 and later, <A HREF="#item_OsFHandleOpenFd"><CODE>OsFHandleOpenFd</CODE></A> calls
  889. <CODE>win32_open_osfhandle()</CODE> from the Perl DLL which doesn't have this
  890. restriction.
  891. <P><CODE>$uMode</CODE> the logical combination of zero or more <CODE>O_*</CODE> constants
  892. exported by the <CODE>Fcntl</CODE> module.  Currently only <CODE>O_APPEND</CODE> and
  893. <CODE>O_TEXT</CODE> have any significance.</P>
  894. <P></P>
  895. <DT><STRONG><A NAME="item_QueryDosDevice">QueryDosDevice</A></STRONG><BR>
  896. <DD>
  897. <DT><STRONG><CODE>$olTargetLen= QueryDosDevice( $sDosDeviceName, $osTargetPath, $lTargetBuf )</CODE></STRONG><BR>
  898. <DD>
  899. Looks up the definition of a given ``DOS'' device name, yielding the
  900. active Windows NT native device name along with any currently dormant
  901. definitions.
  902. <P><CODE>$sDosDeviceName</CODE> is the name of the ``DOS'' device whose definitions
  903. we want.  For example, <CODE>"C:"</CODE>, <CODE>"COM1"</CODE>, or <CODE>"PhysicalDrive0"</CODE>.
  904. If <CODE>$sDosDeviceName</CODE> is <CODE>[]</CODE> [for <CODE>NULL</CODE>], the list of all DOS
  905. device names is returned instead.</P>
  906. <P><CODE>$osTargetPath</CODE> will be assigned a string containing the list of
  907. definitions.  The definitions are each <CODE>'\0'</CODE>-terminate and are
  908. concatenated into the string, most recent first, with an extra <CODE>'\0'</CODE>
  909. at the end of the whole string [see <A HREF="#item_GetLogicalDriveStrings"><CODE>GetLogicalDriveStrings</CODE></A> for
  910. a sample of this format].</P>
  911. <P><CODE>$lTargetBuf</CODE> is the size [in bytes] of the buffer to allocate for
  912. <CODE>$osTargetPath</CODE>.  See <A HREF="#buffers sizes">Buffers Sizes</A> for more information.</P>
  913. <P><CODE>$olTargetLen</CODE> is set to the number of bytes written to
  914. <CODE>$osTargetPath</CODE> but you can also use <A HREF="../../../lib/Pod/perlfunc.html#item_length"><CODE>length($osTargetPath)</CODE></A>
  915. to determine this.</P>
  916. <P>For failure, <CODE>0</CODE> is returned and <CODE>$^E</CODE> is set to the reason for the
  917. failure.</P>
  918. <P></P>
  919. <DT><STRONG><A NAME="item_ReadFile">ReadFile</A></STRONG><BR>
  920. <DD>
  921. <DT><STRONG><CODE>ReadFile( $hFile, $opBuffer, $lBytes, $olBytesRead, $pOverlapped )</CODE></STRONG><BR>
  922. <DD>
  923. Reads bytes from a file or file-like device.
  924. <P><CODE>$hFile</CODE> is a Win32 native file handle open to the file or device to
  925. read from.</P>
  926. <P><CODE>$opBuffer</CODE> will be set to a string containing the bytes read.</P>
  927. <P><CODE>$lBytes</CODE> is the number of bytes you would like to read. 
  928. <CODE>$opBuffer</CODE> is automatically initialized to have a buffer large
  929. enough to hold that many bytes.  Unlike other buffer sizes, <CODE>$lBytes</CODE>
  930. does not need to have a <CODE>"="</CODE> prepended to it to prevent a larger
  931. value to be passed to the underlying Win32 <A HREF="#item_ReadFile"><CODE>ReadFile</CODE></A> API.  However,
  932. a leading <CODE>"="</CODE> will be silently ignored, even if Perl warnings are
  933. enabled.</P>
  934. <P>if <CODE>$olBytesRead</CODE> is not <CODE>[]</CODE>, it will be set to the actual number
  935. of bytes read, though <A HREF="../../../lib/Pod/perlfunc.html#item_length"><CODE>length($opBuffer)</CODE></A> can also be used to
  936. determine this.</P>
  937. <P><CODE>$pOverlapped</CODE> is <CODE>[]</CODE> or is a <CODE>OVERLAPPED</CODE> structure packed
  938. into a string.  This is only useful if <CODE>$hFile</CODE> was opened with
  939. the <CODE>FILE_FLAG_OVERLAPPED</CODE> flag set.</P>
  940. <P></P>
  941. <DT><STRONG><A NAME="item_SetErrorMode">SetErrorMode</A></STRONG><BR>
  942. <DD>
  943. <DT><STRONG><CODE>$uOldMode= SetErrorMode( $uNewMode )</CODE></STRONG><BR>
  944. <DD>
  945. Sets the mode controlling system error handling ∧ returns the
  946. previous mode value.  Both <CODE>$uOldMode</CODE> and <CODE>$uNewMode</CODE> will have
  947. zero or more of the following bits set:
  948. <DL>
  949. <DT><STRONG><A NAME="item_SEM_FAILCRITICALERRORS"><CODE>SEM_FAILCRITICALERRORS</CODE></A></STRONG><BR>
  950. <DD>
  951. If set, indicates that when a critical error is encountered, the call
  952. that triggered the error fails immediately.  Normally this bit is not
  953. set, which means that a critical error causes a dialogue box to appear
  954. notifying the desktop user that some application has triggered a
  955. critical error.   The dialogue box allows the desktop user to decide
  956. whether the critical error is returned to the process, is ignored, or
  957. the offending operation is retried.
  958. <P>This affects the <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A> and <A HREF="#item_GetVolumeInformation"><CODE>GetVolumeInformation</CODE></A> calls.</P>
  959. <P></P>
  960. <DT><STRONG><A NAME="item_SEM_NOALIGNMENTFAULTEXCEPT"><CODE>SEM_NOALIGNMENTFAULTEXCEPT</CODE></A></STRONG><BR>
  961. <DD>
  962. If set, this causes memory access misalignment faults to be
  963. automatically fixed in a manner invisible to the process.  This flag
  964. is ignored on x86-based versions of Windows NT.  This flag is not
  965. supported on Windows 95.
  966. <P></P>
  967. <DT><STRONG><A NAME="item_SEM_NOGPFAULTERRORBOX"><CODE>SEM_NOGPFAULTERRORBOX</CODE></A></STRONG><BR>
  968. <DD>
  969. If set, general protection faults do not generate a dialogue box but
  970. can instead be handled by the process via an exception handler.  This
  971. bit should not be set by programs that don't know how to handle such
  972. faults.
  973. <P></P>
  974. <DT><STRONG><A NAME="item_SEM_NOOPENFILEERRORBOX"><CODE>SEM_NOOPENFILEERRORBOX</CODE></A></STRONG><BR>
  975. <DD>
  976. If set, then when an attempt to continue reading from or writing to
  977. an already open file [usually on a removable medium like a floppy
  978. diskette] finds the file no longer available, the call will
  979. immediately fail.  Normally this bit is not set, which means that
  980. instead a dialogue box will appear notifying the desktop user that
  981. some application has run into this problem.   The dialogue box allows
  982. the desktop user to decide whether the failure is returned to the
  983. process, is ignored, or the offending operation is retried.
  984. <P>This affects the <A HREF="#item_ReadFile"><CODE>ReadFile</CODE></A> and <A HREF="#item_WriteFile"><CODE>WriteFile</CODE></A> calls.</P>
  985. <P></P></DL>
  986. <DT><STRONG><A NAME="item_SetFilePointer">SetFilePointer</A></STRONG><BR>
  987. <DD>
  988. <DT><STRONG><CODE>$uNewPos= SetFilePointer( $hFile, $ivOffset, $ioivOffsetHigh, $uFromWhere )</CODE></STRONG><BR>
  989. <DD>
  990. The native Win32 version of <A HREF="../../../lib/Pod/perlfunc.html#item_seek"><CODE>seek()</CODE></A>.  <A HREF="#item_SetFilePointer"><CODE>SetFilePointer</CODE></A> sets the
  991. position within a file where the next read or write operation will
  992. start from.
  993. <P><CODE>$hFile</CODE> is a Win32 native file handle.</P>
  994. <P><CODE>$uFromWhere</CODE> is either <CODE>FILE_BEGIN</CODE>, <CODE>FILE_CURRENT</CODE>, or
  995. <CODE>FILE_END</CODE>, indicating that the new file position is being specified
  996. relative to the beginning of the file, the current file pointer, or
  997. the end of the file, respectively.</P>
  998. <P><CODE>$ivOffset</CODE> is [if <CODE>$ioivOffsetHigh</CODE> is <CODE>[]</CODE>] the offset [in bytes]
  999. to the new file position from the position specified via
  1000. <CODE>$uFromWhere</CODE>.  If <CODE>$ioivOffsetHigh</CODE> is not <CODE>[]</CODE>, then <CODE>$ivOffset</CODE>
  1001. is treated is converted to an unsigned value to be used as the
  1002. low-order 4 bytes of the offset.</P>
  1003. <P><CODE>$ioivOffsetHigh</CODE> can be <CODE>[]</CODE> [for <CODE>NULL</CODE>] to indicate that you are
  1004. only specifying a 4-byte offset and the resulting file position will
  1005. be 0xFFFFFFFE or less [just under 4GB].  Otherwise <CODE>$ioivOfffsetHigh</CODE>
  1006. starts out with the high-order 4 bytes [signed] of the offset and gets
  1007. set to the [unsigned] high-order 4 bytes of the resulting file position.</P>
  1008. <P>The underlying <A HREF="#item_SetFilePointer"><CODE>SetFilePointer</CODE></A> returns <CODE>0xFFFFFFFF</CODE> to indicate
  1009. failure, but if <CODE>$ioivOffsetHigh</CODE> is not <CODE>[]</CODE>, you would also have
  1010. to check <CODE>$^E</CODE> to determine whether <CODE>0xFFFFFFFF</CODE> indicates an error
  1011. or not.  <CODE>Win32API::File::SetFilePointer</CODE> does this checking for you
  1012. and returns a false value if and only if the underlying
  1013. <A HREF="#item_SetFilePointer"><CODE>SetFilePointer</CODE></A> failed.  For this reason, <CODE>$uNewPos</CODE> is set to <CODE>"0
  1014. but true"</CODE> if you set the file pointer to the beginning of the file
  1015. [or any position with 0 for the low-order 4 bytes].</P>
  1016. <P></P>
  1017. <DT><STRONG><A NAME="item_WriteFile">WriteFile</A></STRONG><BR>
  1018. <DD>
  1019. <DT><STRONG><CODE>WriteFile( $hFile, $pBuffer, $lBytes, $ouBytesWritten, $pOverlapped )</CODE></STRONG><BR>
  1020. <DD>
  1021. Write bytes to a file or file-like device.
  1022. <P><CODE>$hFile</CODE> is a Win32 native file handle open to the file or device to
  1023. write to.</P>
  1024. <P><CODE>$pBuffer</CODE> is a string containing the bytes to be written.</P>
  1025. <P><CODE>$lBytes</CODE> is the number of bytes you would like to write.  If
  1026. <CODE>$pBuffer</CODE> is not at least <CODE>$lBytes</CODE> long, <A HREF="#item_WriteFile"><CODE>WriteFile</CODE></A> croaks.  You
  1027. can specify <CODE>0</CODE> for <CODE>$lBytes</CODE> to write <A HREF="../../../lib/Pod/perlfunc.html#item_length"><CODE>length($pBuffer)</CODE></A> bytes.
  1028. A leading <CODE>"="</CODE> on <CODE>$lBytes</CODE> will be silently ignored, even if Perl
  1029. warnings are enabled.</P>
  1030. <P><CODE>$ouBytesWritten</CODE> will be set to the actual number of bytes written
  1031. unless you specify it as <CODE>[]</CODE>.</P>
  1032. <P><CODE>$pOverlapped</CODE> is <CODE>[]</CODE> or is a <CODE>OVERLAPPED</CODE> structure packed
  1033. into a string.  This is only useful if <CODE>$hFile</CODE> was opened with
  1034. the <CODE>FILE_FLAG_OVERLAPPED</CODE> flag set.</P>
  1035. <P></P></DL>
  1036. <DT><STRONG><A NAME="item_%22%3AFuncA%22"><CODE>":FuncA"</CODE></A></STRONG><BR>
  1037. <DD>
  1038. The ASCII-specific functions.  Each of these is just the same as the
  1039. version without the trailing ``A''.
  1040. <PRE>
  1041.         CopyFileA
  1042.         CreateFileA
  1043.         DefineDosDeviceA
  1044.         DeleteFileA
  1045.         GetDriveTypeA
  1046.         GetLogicalDriveStringsA
  1047.         GetVolumeInformationA
  1048.         MoveFileA
  1049.         MoveFileExA
  1050.         QueryDosDeviceA</PRE>
  1051. <P></P>
  1052. <DT><STRONG><A NAME="item_%22%3AFuncW%22"><CODE>":FuncW"</CODE></A></STRONG><BR>
  1053. <DD>
  1054. The wide-character-specific (Unicode) functions.  Each of these is
  1055. just the same as the version without the trailing ``W'' except that
  1056. strings are expected in Unicode and some lengths are measured as
  1057. number of <CODE>WCHAR</CODE>s instead of number of bytes, as indicated below.
  1058. <DL>
  1059. <DT><STRONG><A NAME="item_CopyFileW">CopyFileW</A></STRONG><BR>
  1060. <DD>
  1061. <DT><STRONG><CODE>CopyFileW( $swOldFileName, $swNewFileName, $bFailIfExists )</CODE></STRONG><BR>
  1062. <DD>
  1063. <CODE>$swOldFileName</CODE> and <CODE>$swNewFileName</CODE> are Unicode strings.
  1064. <P></P>
  1065. <DT><STRONG><A NAME="item_CreateFileW">CreateFileW</A></STRONG><BR>
  1066. <DD>
  1067. <DT><STRONG><CODE>$hObject= CreateFileW( $swPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )</CODE></STRONG><BR>
  1068. <DD>
  1069. <CODE>$swPath</CODE> is Unicode.
  1070. <P></P>
  1071. <DT><STRONG><A NAME="item_DefineDosDeviceW">DefineDosDeviceW</A></STRONG><BR>
  1072. <DD>
  1073. <DT><STRONG><CODE>DefineDosDeviceW( $uFlags, $swDosDeviceName, $swTargetPath )</CODE></STRONG><BR>
  1074. <DD>
  1075. <CODE>$swDosDeviceName</CODE> and <CODE>$swTargetPath</CODE> are Unicode.
  1076. <P></P>
  1077. <DT><STRONG><A NAME="item_DeleteFileW">DeleteFileW</A></STRONG><BR>
  1078. <DD>
  1079. <DT><STRONG><CODE>DeleteFileW( $swFileName )</CODE></STRONG><BR>
  1080. <DD>
  1081. <CODE>$swFileName</CODE> is Unicode.
  1082. <P></P>
  1083. <DT><STRONG><A NAME="item_GetDriveTypeW">GetDriveTypeW</A></STRONG><BR>
  1084. <DD>
  1085. <DT><STRONG><CODE>$uDriveType= GetDriveTypeW( $swRootPath )</CODE></STRONG><BR>
  1086. <DD>
  1087. <CODE>$swRootPath</CODE> is Unicode.
  1088. <P></P>
  1089. <DT><STRONG><A NAME="item_GetLogicalDriveStringsW">GetLogicalDriveStringsW</A></STRONG><BR>
  1090. <DD>
  1091. <DT><STRONG><CODE>$olwOutLength= GetLogicalDriveStringsW( $lwBufSize, $oswBuffer )</CODE></STRONG><BR>
  1092. <DD>
  1093. Unicode is stored in <CODE>$oswBuffer</CODE>.  <CODE>$lwBufSize</CODE> and <CODE>$olwOutLength</CODE>
  1094. are measured as number of <CODE>WCHAR</CODE>s.
  1095. <P></P>
  1096. <DT><STRONG><A NAME="item_GetVolumeInformationW">GetVolumeInformationW</A></STRONG><BR>
  1097. <DD>
  1098. <DT><STRONG><CODE>GetVolumeInformationW( $swRootPath, $oswVolName, $lwVolName, $ouSerialNum, $ouMaxNameLen, $ouFsFlags, $oswFsType, $lwFsType )</CODE></STRONG><BR>
  1099. <DD>
  1100. <CODE>$swRootPath</CODE> is Unicode and Unicode is written to <CODE>$oswVolName</CODE> and
  1101. <CODE>$oswFsType</CODE>.  <CODE>$lwVolName</CODE> and <CODE>$lwFsType</CODE> are measures as number
  1102. of <CODE>WCHAR</CODE>s.
  1103. <P></P>
  1104. <DT><STRONG><A NAME="item_MoveFileW">MoveFileW</A></STRONG><BR>
  1105. <DD>
  1106. <DT><STRONG><CODE>MoveFileW( $swOldName, $swNewName )</CODE></STRONG><BR>
  1107. <DD>
  1108. <CODE>$swOldName</CODE> and <CODE>$swNewName</CODE> are Unicode.
  1109. <P></P>
  1110. <DT><STRONG><A NAME="item_MoveFileExW">MoveFileExW</A></STRONG><BR>
  1111. <DD>
  1112. <DT><STRONG><CODE>MoveFileExW( $swOldName, $swNewName, $uFlags )</CODE></STRONG><BR>
  1113. <DD>
  1114. <CODE>$swOldName</CODE> and <CODE>$swNewName</CODE> are Unicode.
  1115. <P></P>
  1116. <DT><STRONG><A NAME="item_QueryDosDeviceW">QueryDosDeviceW</A></STRONG><BR>
  1117. <DD>
  1118. <DT><STRONG><CODE>$olwTargetLen= QueryDosDeviceW( $swDeviceName, $oswTargetPath, $lwTargetBuf )</CODE></STRONG><BR>
  1119. <DD>
  1120. <CODE>$swDeviceName</CODE> is Unicode and Unicode is written to
  1121. <CODE>$oswTargetPath</CODE>.  <CODE>$lwTargetBuf</CODE> and <CODE>$olwTargetLen</CODE> are measured
  1122. as number of  <CODE>WCHAR</CODE>s.
  1123. <P></P></DL>
  1124. <DT><STRONG><A NAME="item_%22%3AMisc%22"><CODE>":Misc"</CODE></A></STRONG><BR>
  1125. <DD>
  1126. Miscellaneous constants.  Used for the <CODE>$uCreate</CODE> argument of
  1127. <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A> or the <CODE>$uFromWhere</CODE> argument of <A HREF="#item_SetFilePointer"><CODE>SetFilePointer</CODE></A>.
  1128. Plus <CODE>INVALID_HANDLE_VALUE</CODE>, which you usually won't need to check
  1129. for since <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A> translates it into a false value.
  1130. <PRE>
  1131.         CREATE_ALWAYS           CREATE_NEW              OPEN_ALWAYS
  1132.         OPEN_EXISTING           TRUNCATE_EXISTING       INVALID_HANDLE_VALUE
  1133.         FILE_BEGIN              FILE_CURRENT            FILE_END</PRE>
  1134. <P></P>
  1135. <DT><STRONG><A NAME="item_%22%3ADDD_%22"><CODE>":DDD_"</CODE></A></STRONG><BR>
  1136. <DD>
  1137. Constants for the <CODE>$uFlags</CODE> argument of <A HREF="#item_DefineDosDevice"><CODE>DefineDosDevice</CODE></A>.
  1138. <PRE>
  1139.         DDD_EXACT_MATCH_ON_REMOVE
  1140.         DDD_RAW_TARGET_PATH
  1141.         DDD_REMOVE_DEFINITION</PRE>
  1142. <P></P>
  1143. <DT><STRONG><A NAME="item_%22%3ADRIVE_%22"><CODE>":DRIVE_"</CODE></A></STRONG><BR>
  1144. <DD>
  1145. Constants returned by <A HREF="#item_GetDriveType"><CODE>GetDriveType</CODE></A>.
  1146. <PRE>
  1147.         DRIVE_UNKNOWN           DRIVE_NO_ROOT_DIR       DRIVE_REMOVABLE
  1148.         DRIVE_FIXED             DRIVE_REMOTE            DRIVE_CDROM
  1149.         DRIVE_RAMDISK</PRE>
  1150. <P></P>
  1151. <DT><STRONG><A NAME="item_%22%3AFILE_%22"><CODE>":FILE_"</CODE></A></STRONG><BR>
  1152. <DD>
  1153. Specific types of access to files that can be requested via the
  1154. <CODE>$uAccess</CODE> argument to <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A>.
  1155. <PRE>
  1156.         FILE_READ_DATA                  FILE_LIST_DIRECTORY
  1157.         FILE_WRITE_DATA                 FILE_ADD_FILE
  1158.         FILE_APPEND_DATA                FILE_ADD_SUBDIRECTORY
  1159.         FILE_CREATE_PIPE_INSTANCE       FILE_READ_EA
  1160.         FILE_WRITE_EA                   FILE_EXECUTE
  1161.         FILE_TRAVERSE                   FILE_DELETE_CHILD
  1162.         FILE_READ_ATTRIBUTES            FILE_WRITE_ATTRIBUTES
  1163.         FILE_ALL_ACCESS                 FILE_GENERIC_READ
  1164.         FILE_GENERIC_WRITE              FILE_GENERIC_EXECUTE )],</PRE>
  1165. <P></P>
  1166. <DT><STRONG><A NAME="item_%22%3AFILE_ATTRIBUTE_%22"><CODE>":FILE_ATTRIBUTE_"</CODE></A></STRONG><BR>
  1167. <DD>
  1168. File attribute constants.  Returned by <A HREF="#item_attrLetsToBits"><CODE>attrLetsToBits</CODE></A> and used in
  1169. the <CODE>$uFlags</CODE> argument to <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A>.
  1170. <PRE>
  1171.         FILE_ATTRIBUTE_ARCHIVE          FILE_ATTRIBUTE_COMPRESSED
  1172.         FILE_ATTRIBUTE_HIDDEN           FILE_ATTRIBUTE_NORMAL
  1173.         FILE_ATTRIBUTE_OFFLINE          FILE_ATTRIBUTE_READONLY
  1174.         FILE_ATTRIBUTE_SYSTEM           FILE_ATTRIBUTE_TEMPORARY</PRE>
  1175. <P></P>
  1176. <DT><STRONG><A NAME="item_%22%3AFILE_FLAG_%22"><CODE>":FILE_FLAG_"</CODE></A></STRONG><BR>
  1177. <DD>
  1178. File option flag constants.  Used in the <CODE>$uFlags</CODE> argument to
  1179. <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A>.
  1180. <PRE>
  1181.         FILE_FLAG_BACKUP_SEMANTICS      FILE_FLAG_DELETE_ON_CLOSE
  1182.         FILE_FLAG_NO_BUFFERING          FILE_FLAG_OVERLAPPED
  1183.         FILE_FLAG_POSIX_SEMANTICS       FILE_FLAG_RANDOM_ACCESS
  1184.         FILE_FLAG_SEQUENTIAL_SCAN       FILE_FLAG_WRITE_THROUGH</PRE>
  1185. <P></P>
  1186. <DT><STRONG><A NAME="item_%22%3AFILE_SHARE_%22"><CODE>":FILE_SHARE_"</CODE></A></STRONG><BR>
  1187. <DD>
  1188. File sharing constants.  Used in the <CODE>$uShare</CODE> argument to
  1189. <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A>.
  1190. <PRE>
  1191.         FILE_SHARE_DELETE       FILE_SHARE_READ         FILE_SHARE_WRITE</PRE>
  1192. <P></P>
  1193. <DT><STRONG><A NAME="item_%22%3AFILE_TYPE_%22"><CODE>":FILE_TYPE_"</CODE></A></STRONG><BR>
  1194. <DD>
  1195. File type constants.  Returned by <A HREF="#item_GetFileType"><CODE>GetFileType</CODE></A>.
  1196. <PRE>
  1197.         FILE_TYPE_CHAR          FILE_TYPE_DISK
  1198.         FILE_TYPE_PIPE          FILE_TYPE_UNKNOWN</PRE>
  1199. <P></P>
  1200. <DT><STRONG><A NAME="item_%22%3AFS_%22"><CODE>":FS_"</CODE></A></STRONG><BR>
  1201. <DD>
  1202. File system characteristics constants.  Placed in the <CODE>$ouFsFlags</CODE>
  1203. argument to <A HREF="#item_GetVolumeInformation"><CODE>GetVolumeInformation</CODE></A>.
  1204. <PRE>
  1205.         FS_CASE_IS_PRESERVED            FS_CASE_SENSITIVE
  1206.         FS_UNICODE_STORED_ON_DISK       FS_PERSISTENT_ACLS 
  1207.         FS_FILE_COMPRESSION             FS_VOL_IS_COMPRESSED</PRE>
  1208. <P></P>
  1209. <DT><STRONG><A NAME="item_%22%3AIOCTL_STORAGE_%22"><CODE>":IOCTL_STORAGE_"</CODE></A></STRONG><BR>
  1210. <DD>
  1211. I/O control operations for generic storage devices.  Used in the
  1212. <CODE>$uIoControlCode</CODE> argument to <A HREF="#item_DeviceIoControl"><CODE>DeviceIoControl</CODE></A>.  Includes
  1213. <A HREF="#item_IOCTL_STORAGE_CHECK_VERIFY"><CODE>IOCTL_STORAGE_CHECK_VERIFY</CODE></A>, <A HREF="#item_IOCTL_STORAGE_MEDIA_REMOVAL"><CODE>IOCTL_STORAGE_MEDIA_REMOVAL</CODE></A>,
  1214. <A HREF="#item_IOCTL_STORAGE_EJECT_MEDIA"><CODE>IOCTL_STORAGE_EJECT_MEDIA</CODE></A>, <A HREF="#item_IOCTL_STORAGE_LOAD_MEDIA"><CODE>IOCTL_STORAGE_LOAD_MEDIA</CODE></A>,
  1215. <A HREF="#item_IOCTL_STORAGE_RESERVE"><CODE>IOCTL_STORAGE_RESERVE</CODE></A>, <A HREF="#item_IOCTL_STORAGE_RELEASE"><CODE>IOCTL_STORAGE_RELEASE</CODE></A>,
  1216. <A HREF="#item_IOCTL_STORAGE_FIND_NEW_DEVICES"><CODE>IOCTL_STORAGE_FIND_NEW_DEVICES</CODE></A>, and
  1217. <A HREF="#item_IOCTL_STORAGE_GET_MEDIA_TYPES"><CODE>IOCTL_STORAGE_GET_MEDIA_TYPES</CODE></A>.
  1218. <DL>
  1219. <DT><STRONG><A NAME="item_IOCTL_STORAGE_CHECK_VERIFY"><CODE>IOCTL_STORAGE_CHECK_VERIFY</CODE></A></STRONG><BR>
  1220. <DD>
  1221. Verify that a device's media is accessible.  <CODE>$pInBuf</CODE> and <CODE>$opOutBuf</CODE>
  1222. should both be <CODE>[]</CODE>.  If <A HREF="#item_DeviceIoControl"><CODE>DeviceIoControl</CODE></A> returns a true value, then
  1223. the media is currently accessible.
  1224. <P></P>
  1225. <DT><STRONG><A NAME="item_IOCTL_STORAGE_MEDIA_REMOVAL"><CODE>IOCTL_STORAGE_MEDIA_REMOVAL</CODE></A></STRONG><BR>
  1226. <DD>
  1227. Allows the device's media to be locked or unlocked.  <CODE>$opOutBuf</CODE> should
  1228. be <CODE>[]</CODE>.  <CODE>$pInBuf</CODE> should be a <CODE>PREVENT_MEDIA_REMOVAL</CODE> data structure,
  1229. which is simply an interger containing a boolean value:
  1230. <PRE>
  1231.     $pInBuf= pack( "i", $bPreventMediaRemoval );</PRE>
  1232. <P></P>
  1233. <DT><STRONG><A NAME="item_IOCTL_STORAGE_EJECT_MEDIA"><CODE>IOCTL_STORAGE_EJECT_MEDIA</CODE></A></STRONG><BR>
  1234. <DD>
  1235. Requests that the device eject the media.  <CODE>$pInBuf</CODE> and <CODE>$opOutBuf</CODE>
  1236. should both be <CODE>[]</CODE>.
  1237. <P></P>
  1238. <DT><STRONG><A NAME="item_IOCTL_STORAGE_LOAD_MEDIA"><CODE>IOCTL_STORAGE_LOAD_MEDIA</CODE></A></STRONG><BR>
  1239. <DD>
  1240. Requests that the device load the media.  <CODE>$pInBuf</CODE> and <CODE>$opOutBuf</CODE>
  1241. should both be <CODE>[]</CODE>.
  1242. <P></P>
  1243. <DT><STRONG><A NAME="item_IOCTL_STORAGE_RESERVE"><CODE>IOCTL_STORAGE_RESERVE</CODE></A></STRONG><BR>
  1244. <DD>
  1245. Requests that the device be reserved.  <CODE>$pInBuf</CODE> and <CODE>$opOutBuf</CODE>
  1246. should both be <CODE>[]</CODE>.
  1247. <P></P>
  1248. <DT><STRONG><A NAME="item_IOCTL_STORAGE_RELEASE"><CODE>IOCTL_STORAGE_RELEASE</CODE></A></STRONG><BR>
  1249. <DD>
  1250. Releases a previous device reservation.  <CODE>$pInBuf</CODE> and <CODE>$opOutBuf</CODE>
  1251. should both be <CODE>[]</CODE>.
  1252. <P></P>
  1253. <DT><STRONG><A NAME="item_IOCTL_STORAGE_FIND_NEW_DEVICES"><CODE>IOCTL_STORAGE_FIND_NEW_DEVICES</CODE></A></STRONG><BR>
  1254. <DD>
  1255. No documentation on this IOCTL operation was found.
  1256. <P></P>
  1257. <DT><STRONG><A NAME="item_IOCTL_STORAGE_GET_MEDIA_TYPES"><CODE>IOCTL_STORAGE_GET_MEDIA_TYPES</CODE></A></STRONG><BR>
  1258. <DD>
  1259. Requests information about the type of media supported by the device. 
  1260. <CODE>$pInBuf</CODE> should be <CODE>[]</CODE>.  <CODE>$opOutBuf</CODE> will be set to contain a
  1261. vector of <CODE>DISK_GEOMETRY</CODE> data structures, which can be decoded via:
  1262. <PRE>
  1263.     # Calculate the number of DISK_GEOMETRY structures returned:
  1264.     my $cStructs= length($opOutBuf)/(4+4+4+4+4+4);
  1265.     my @fields= unpack( "L l I L L L" x $cStructs, $opOutBuf )
  1266.     my( @ucCylsLow, @ivcCylsHigh, @uMediaType, @uTracksPerCyl,
  1267.       @uSectsPerTrack, @uBytesPerSect )= ();
  1268.     while(  @fields  ) {
  1269.         push( @ucCylsLow, unshift @fields );
  1270.         push( @ivcCylsHigh, unshift @fields );
  1271.         push( @uMediaType, unshift @fields );
  1272.         push( @uTracksPerCyl, unshift @fields );
  1273.         push( @uSectsPerTrack, unshift @fields );
  1274.         push( @uBytesPerSect, unshift @fields );
  1275.     }</PRE>
  1276. <P>For the <CODE>$i</CODE>th type of supported media, the following variables will
  1277. contain the following data.</P>
  1278. <DL>
  1279. <DT><STRONG><A NAME="item_%24ucCylsLow%5B%24i%5D"><CODE>$ucCylsLow[$i]</CODE></A></STRONG><BR>
  1280. <DD>
  1281. The low-order 4 bytes of the total number of cylinders.
  1282. <P></P>
  1283. <DT><STRONG><A NAME="item_%24ivcCylsHigh%5B%24i%5D"><CODE>$ivcCylsHigh[$i]</CODE></A></STRONG><BR>
  1284. <DD>
  1285. The high-order 4 bytes of the total number of cylinders.
  1286. <P></P>
  1287. <DT><STRONG><A NAME="item_%24uMediaType%5B%24i%5D"><CODE>$uMediaType[$i]</CODE></A></STRONG><BR>
  1288. <DD>
  1289. A code for the type of media.  See the <A HREF="#item_%22%3AMEDIA_TYPE%22"><CODE>":MEDIA_TYPE"</CODE></A> export class.
  1290. <P></P>
  1291. <DT><STRONG><A NAME="item_%24uTracksPerCyl%5B%24i%5D"><CODE>$uTracksPerCyl[$i]</CODE></A></STRONG><BR>
  1292. <DD>
  1293. The number of tracks in each cylinder.
  1294. <P></P>
  1295. <DT><STRONG><A NAME="item_%24uSectsPerTrack%5B%24i%5D"><CODE>$uSectsPerTrack[$i]</CODE></A></STRONG><BR>
  1296. <DD>
  1297. The number of sectors in each track.
  1298. <P></P>
  1299. <DT><STRONG><A NAME="item_%24uBytesPerSect%5B%24i%5D"><CODE>$uBytesPerSect[$i]</CODE></A></STRONG><BR>
  1300. <DD>
  1301. The number of bytes in each sector.
  1302. <P></P></DL>
  1303. </DL>
  1304. <DT><STRONG><A NAME="item_%22%3AIOCTL_DISK_%22"><CODE>":IOCTL_DISK_"</CODE></A></STRONG><BR>
  1305. <DD>
  1306. I/O control operations for disk devices.  Used in the
  1307. <CODE>$uIoControlCode</CODE> argument to <A HREF="#item_DeviceIoControl"><CODE>DeviceIoControl</CODE></A>.  Most of these
  1308. are to be used on physical drive devices like <A HREF="#item_%22%2F%2F%2E%2FPhysicalDrive0%22"><CODE>"//./PhysicalDrive0"</CODE></A>.
  1309. However, <A HREF="#item_IOCTL_DISK_GET_PARTITION_INFO"><CODE>IOCTL_DISK_GET_PARTITION_INFO</CODE></A> and
  1310. <A HREF="#item_IOCTL_DISK_SET_PARTITION_INFO"><CODE>IOCTL_DISK_SET_PARTITION_INFO</CODE></A> should only be used on a
  1311. single-partition device like <A HREF="#item_%22%2F%2F%2E%2FC%3A%22"><CODE>"//./C:"</CODE></A>.
  1312. <P>Includes <A HREF="#item_IOCTL_DISK_GET_DRIVE_GEOMETRY"><CODE>IOCTL_DISK_GET_DRIVE_GEOMETRY</CODE></A>,
  1313. <A HREF="#item_IOCTL_DISK_GET_PARTITION_INFO"><CODE>IOCTL_DISK_GET_PARTITION_INFO</CODE></A>, <A HREF="#item_IOCTL_DISK_SET_PARTITION_INFO"><CODE>IOCTL_DISK_SET_PARTITION_INFO</CODE></A>,
  1314. <A HREF="#item_IOCTL_DISK_GET_DRIVE_LAYOUT"><CODE>IOCTL_DISK_GET_DRIVE_LAYOUT</CODE></A>, <A HREF="#item_IOCTL_DISK_SET_DRIVE_LAYOUT"><CODE>IOCTL_DISK_SET_DRIVE_LAYOUT</CODE></A>,
  1315. <A HREF="#item_IOCTL_DISK_VERIFY"><CODE>IOCTL_DISK_VERIFY</CODE></A>, <A HREF="#item_IOCTL_DISK_FORMAT_TRACKS"><CODE>IOCTL_DISK_FORMAT_TRACKS</CODE></A>,
  1316. <A HREF="#item_IOCTL_DISK_REASSIGN_BLOCKS"><CODE>IOCTL_DISK_REASSIGN_BLOCKS</CODE></A>, <A HREF="#item_IOCTL_DISK_PERFORMANCE"><CODE>IOCTL_DISK_PERFORMANCE</CODE></A>,
  1317. <A HREF="#item_IOCTL_DISK_IS_WRITABLE"><CODE>IOCTL_DISK_IS_WRITABLE</CODE></A>, <A HREF="#item_IOCTL_DISK_LOGGING"><CODE>IOCTL_DISK_LOGGING</CODE></A>,
  1318. <A HREF="#item_IOCTL_DISK_FORMAT_TRACKS_EX"><CODE>IOCTL_DISK_FORMAT_TRACKS_EX</CODE></A>, <A HREF="#item_IOCTL_DISK_HISTOGRAM_STRUCTURE"><CODE>IOCTL_DISK_HISTOGRAM_STRUCTURE</CODE></A>,
  1319. <A HREF="#item_IOCTL_DISK_HISTOGRAM_DATA"><CODE>IOCTL_DISK_HISTOGRAM_DATA</CODE></A>, <A HREF="#item_IOCTL_DISK_HISTOGRAM_RESET"><CODE>IOCTL_DISK_HISTOGRAM_RESET</CODE></A>,
  1320. <A HREF="#item_IOCTL_DISK_REQUEST_STRUCTURE"><CODE>IOCTL_DISK_REQUEST_STRUCTURE</CODE></A>, and <A HREF="#item_IOCTL_DISK_REQUEST_DATA"><CODE>IOCTL_DISK_REQUEST_DATA</CODE></A>.</P>
  1321. <DL>
  1322. <DT><STRONG><A NAME="item_IOCTL_DISK_GET_DRIVE_GEOMETRY"><CODE>IOCTL_DISK_GET_DRIVE_GEOMETRY</CODE></A></STRONG><BR>
  1323. <DD>
  1324. Request information about the size and geometry of the disk.  <CODE>$pInBuf</CODE>
  1325. should be <CODE>[]</CODE>.  <CODE>$opOutBuf</CODE> will be set to a <CODE>DISK_GEOMETRY</CODE> data
  1326. structure which can be decode via:
  1327. <PRE>
  1328.     ( $ucCylsLow, $ivcCylsHigh, $uMediaType, $uTracksPerCyl,
  1329.       $uSectsPerTrack, $uBytesPerSect )= unpack( "L l I L L L", $opOutBuf );</PRE>
  1330. <DL>
  1331. <DT><STRONG><A NAME="item_%24ucCylsLow"><CODE>$ucCylsLow</CODE></A></STRONG><BR>
  1332. <DD>
  1333. The low-order 4 bytes of the total number of cylinders.
  1334. <P></P>
  1335. <DT><STRONG><A NAME="item_%24ivcCylsHigh"><CODE>$ivcCylsHigh</CODE></A></STRONG><BR>
  1336. <DD>
  1337. The high-order 4 bytes of the total number of cylinders.
  1338. <P></P>
  1339. <DT><STRONG><A NAME="item_%24uMediaType"><CODE>$uMediaType</CODE></A></STRONG><BR>
  1340. <DD>
  1341. A code for the type of media.  See the <A HREF="#item_%22%3AMEDIA_TYPE%22"><CODE>":MEDIA_TYPE"</CODE></A> export class.
  1342. <P></P>
  1343. <DT><STRONG><A NAME="item_%24uTracksPerCyl"><CODE>$uTracksPerCyl</CODE></A></STRONG><BR>
  1344. <DD>
  1345. The number of tracks in each cylinder.
  1346. <P></P>
  1347. <DT><STRONG><A NAME="item_%24uSectsPerTrack"><CODE>$uSectsPerTrack</CODE></A></STRONG><BR>
  1348. <DD>
  1349. The number of sectors in each track.
  1350. <P></P>
  1351. <DT><STRONG><A NAME="item_%24uBytesPerSect"><CODE>$uBytesPerSect</CODE></A></STRONG><BR>
  1352. <DD>
  1353. The number of bytes in each sector.
  1354. <P></P></DL>
  1355. <DT><STRONG><A NAME="item_IOCTL_DISK_GET_PARTITION_INFO"><CODE>IOCTL_DISK_GET_PARTITION_INFO</CODE></A></STRONG><BR>
  1356. <DD>
  1357. Request information about the size and geometry of the partition. 
  1358. <CODE>$pInBuf</CODE> should be <CODE>[]</CODE>.  <CODE>$opOutBuf</CODE> will be set to a
  1359. <CODE>PARTITION_INFORMATION</CODE> data structure which can be decode via:
  1360. <PRE>
  1361.     ( $uStartLow, $ivStartHigh, $ucHiddenSects, $uPartitionSeqNumber,
  1362.       $uPartitionType, $bActive, $bRecognized, $bToRewrite )=
  1363.       unpack( "L l L L C c c c", $opOutBuf );</PRE>
  1364. <DL>
  1365. <DT><STRONG><A NAME="item_%24uStartLow_and_%24ivStartHigh"><CODE>$uStartLow</CODE> and <CODE>$ivStartHigh</CODE></A></STRONG><BR>
  1366. <DD>
  1367. The low-order and high-order [respectively] 4 bytes of the starting
  1368. offset of the partition, measured in bytes.
  1369. <P></P>
  1370. <DT><STRONG><A NAME="item_%24ucHiddenSects"><CODE>$ucHiddenSects</CODE></A></STRONG><BR>
  1371. <DD>
  1372. The number of ``hidden'' sectors for this partition.  Actually this is
  1373. the number of sectors found prior to this partiton, that is, the
  1374. starting offset [as found in <CODE>$uStartLow</CODE> and <CODE>$ivStartHigh</CODE>]
  1375. divided by the number of bytes per sector.
  1376. <P></P>
  1377. <DT><STRONG><A NAME="item_%24uPartitionSeqNumber"><CODE>$uPartitionSeqNumber</CODE></A></STRONG><BR>
  1378. <DD>
  1379. The sequence number of this partition.  Partitions are numbered
  1380. starting as <CODE>1</CODE> [with ``partition 0'' meaning the entire disk].  
  1381. Sometimes this field may be <CODE>0</CODE> and you'll have to infer the
  1382. partition sequence number from how many partitions preceed it on
  1383. the disk.
  1384. <P></P>
  1385. <DT><STRONG><A NAME="item_%24uPartitionType"><CODE>$uPartitionType</CODE></A></STRONG><BR>
  1386. <DD>
  1387. The type of partition.  See the <A HREF="#item_%22%3APARTITION_%22"><CODE>":PARTITION_"</CODE></A> export class for a
  1388. list of known types.  See also <A HREF="#item_IsRecognizedPartition"><CODE>IsRecognizedPartition</CODE></A> and
  1389. <A HREF="#item_IsContainerPartition"><CODE>IsContainerPartition</CODE></A>.
  1390. <P></P>
  1391. <DT><STRONG><A NAME="item_%24bActive"><CODE>$bActive</CODE></A></STRONG><BR>
  1392. <DD>
  1393. <CODE>1</CODE> for the active [boot] partition, <CODE>0</CODE> otherwise.
  1394. <P></P>
  1395. <DT><STRONG><A NAME="item_%24bRecognized"><CODE>$bRecognized</CODE></A></STRONG><BR>
  1396. <DD>
  1397. Whether this type of partition is support under Win32.
  1398. <P></P>
  1399. <DT><STRONG><A NAME="item_%24bToRewrite"><CODE>$bToRewrite</CODE></A></STRONG><BR>
  1400. <DD>
  1401. Whether to update this partition information.  This field is not used
  1402. by <A HREF="#item_IOCTL_DISK_GET_PARTITION_INFO"><CODE>IOCTL_DISK_GET_PARTITION_INFO</CODE></A>.  For
  1403. <A HREF="#item_IOCTL_DISK_SET_DRIVE_LAYOUT"><CODE>IOCTL_DISK_SET_DRIVE_LAYOUT</CODE></A>, you must set this field to a true
  1404. value for any partitions you wish to have changed, added, or deleted.
  1405. <P></P></DL>
  1406. <DT><STRONG><A NAME="item_IOCTL_DISK_SET_PARTITION_INFO"><CODE>IOCTL_DISK_SET_PARTITION_INFO</CODE></A></STRONG><BR>
  1407. <DD>
  1408. Change the type of the partition.  <CODE>$opOutBuf</CODE> should be <CODE>[]</CODE>.
  1409. <CODE>$pInBuf</CODE> should be a <CODE>SET_PARTITION_INFORMATION</CODE> data structure
  1410. which is just a single byte containing the new parition type [see
  1411. the <A HREF="#item_%22%3APARTITION_%22"><CODE>":PARTITION_"</CODE></A> export class for a list of known types]:
  1412. <PRE>
  1413.     $pInBuf= pack( "C", $uPartitionType );</PRE>
  1414. <P></P>
  1415. <DT><STRONG><A NAME="item_IOCTL_DISK_GET_DRIVE_LAYOUT"><CODE>IOCTL_DISK_GET_DRIVE_LAYOUT</CODE></A></STRONG><BR>
  1416. <DD>
  1417. Request information about the disk layout.  <CODE>$pInBuf</CODE> should be <CODE>[]</CODE>.
  1418. <CODE>$opOutBuf</CODE> will be set to contain <CODE>DRIVE_LAYOUT_INFORMATION</CODE>
  1419. structure including several <CODE>PARTITION_INFORMATION</CODE> structures:
  1420. <PRE>
  1421.     my( $cPartitions, $uDiskSignature )= unpack( "L L", $opOutBuf );
  1422.     my @fields= unpack( "x8" . ( "L l L L C c c c" x $cPartitions ),
  1423.                         $opOutBuf );
  1424.     my( @uStartLow, @ivStartHigh, @ucHiddenSects,
  1425.       @uPartitionSeqNumber, @uPartitionType, @bActive,
  1426.       @bRecognized, @bToRewrite )= ();
  1427.     for(  1..$cPartition  ) {
  1428.         push( @uStartLow, unshift @fields );
  1429.         push( @ivStartHigh, unshift @fields );
  1430.         push( @ucHiddenSects, unshift @fields );
  1431.         push( @uPartitionSeqNumber, unshift @fields );
  1432.         push( @uPartitionType, unshift @fields );
  1433.         push( @bActive, unshift @fields );
  1434.         push( @bRecognized, unshift @fields );
  1435.         push( @bToRewrite, unshift @fields );
  1436.     }</PRE>
  1437. <DL>
  1438. <DT><STRONG><A NAME="item_%24cPartitions"><CODE>$cPartitions</CODE></A></STRONG><BR>
  1439. <DD>
  1440. If the number of partitions on the disk.
  1441. <P></P>
  1442. <DT><STRONG><A NAME="item_%24uDiskSignature"><CODE>$uDiskSignature</CODE></A></STRONG><BR>
  1443. <DD>
  1444. Is the disk signature, a unique number assigned by Disk Administrator
  1445. [<EM>WinDisk.exe</EM>] and used to identify the disk.  This allows drive
  1446. letters for partitions on that disk to remain constant even if the
  1447. SCSI Target ID of the disk gets changed.
  1448. <P></P></DL>
  1449. <P>See <CODE>IOCTL_DISK_GET_PARTITION_INFORMATION</CODE> for information on the
  1450. remaining these fields.</P>
  1451. <DT><STRONG><A NAME="item_IOCTL_DISK_SET_DRIVE_LAYOUT"><CODE>IOCTL_DISK_SET_DRIVE_LAYOUT</CODE></A></STRONG><BR>
  1452. <DD>
  1453. Change the partition layout of the disk.  <CODE>$pOutBuf</CODE> should be <CODE>[]</CODE>.
  1454. <CODE>$pInBuf</CODE> should be a <CODE>DISK_LAYOUT_INFORMATION</CODE> data structure
  1455. including several <CODE>PARTITION_INFORMATION</CODE> data structures.
  1456. <PRE>
  1457.     # Already set:  $cPartitions, $uDiskSignature, @uStartLow, @ivStartHigh,
  1458.     #   @ucHiddenSects, @uPartitionSeqNumber, @uPartitionType, @bActive,
  1459.     #   @bRecognized, and @bToRewrite.
  1460.     my( @fields, $prtn )= ();
  1461.     for $prtn (  1..$cPartition  ) {
  1462.         push( @fields, $uStartLow[$prtn-1], $ivStartHigh[$prtn-1],
  1463.             $ucHiddenSects[$prtn-1], $uPartitionSeqNumber[$prtn-1],
  1464.             $uPartitionType[$prtn-1], $bActive[$prtn-1],
  1465.             $bRecognized[$prtn-1], $bToRewrite[$prtn-1] );
  1466.     }
  1467.     $pInBuf= pack( "L L" . ( "L l L L C c c c" x $cPartitions ),
  1468.                    $cPartitions, $uDiskSignature, @fields );</PRE>
  1469. <P>To delete a partition, zero out all fields except for <A HREF="#item_%24bToRewrite"><CODE>$bToRewrite</CODE></A>
  1470. which should be set to <CODE>1</CODE>.  To add a partition, increment
  1471. <A HREF="#item_%24cPartitions"><CODE>$cPartitions</CODE></A> and add the information for the new partition
  1472. into the arrays, making sure that you insert <CODE>1</CODE> into @bToRewrite.</P>
  1473. <P>See <A HREF="#item_IOCTL_DISK_GET_DRIVE_LAYOUT"><CODE>IOCTL_DISK_GET_DRIVE_LAYOUT</CODE></A> and
  1474. <CODE>IOCTL_DISK_GET_PARITITON_INFORMATION</CODE> for descriptions of the
  1475. fields.</P>
  1476. <P></P>
  1477. <DT><STRONG><A NAME="item_IOCTL_DISK_VERIFY"><CODE>IOCTL_DISK_VERIFY</CODE></A></STRONG><BR>
  1478. <DD>
  1479. Performs a logical format of [part of] the disk.  <CODE>$opOutBuf</CODE> should
  1480. be <CODE>[]</CODE>.  <CODE>$pInBuf</CODE> should contain a <CODE>VERIFY_INFORMATION</CODE> data
  1481. structure:
  1482. <PRE>
  1483.     $pInBuf= pack( "L l L",
  1484.                    $uStartOffsetLow, $ivStartOffsetHigh, $uLength );</PRE>
  1485. <DL>
  1486. <DT><STRONG><A NAME="item_%24uStartOffsetLow_and_%24ivStartOffsetHigh"><CODE>$uStartOffsetLow</CODE> and <CODE>$ivStartOffsetHigh</CODE></A></STRONG><BR>
  1487. <DD>
  1488. The low-order and high-order [respectively] 4 bytes of the offset [in
  1489. bytes] where the formatting should begin.
  1490. <P></P>
  1491. <DT><STRONG><A NAME="item_%24uLength"><CODE>$uLength</CODE></A></STRONG><BR>
  1492. <DD>
  1493. <PRE>
  1494.  
  1495. The length [in bytes] of the section to be formatted.</PRE>
  1496. </DL>
  1497. <DT><STRONG><A NAME="item_IOCTL_DISK_FORMAT_TRACKS"><CODE>IOCTL_DISK_FORMAT_TRACKS</CODE></A></STRONG><BR>
  1498. <DD>
  1499. Format a range of tracks on the disk.  <CODE>$opOutBuf</CODE> should be <CODE>[]</CODE>. 
  1500. <CODE>$pInBuf</CODE> should contain a <CODE>FORMAT_PARAMETERS</CODE> data structure:
  1501. <PRE>
  1502.     $pInBuf= pack( "L L L L L", $uMediaType,
  1503.                    $uStartCyl, $uEndCyl, $uStartHead, $uEndHead );</PRE>
  1504. <P><A HREF="#item_%24uMediaType"><CODE>$uMediaType</CODE></A> if the type of media to be formatted.  Mostly used to
  1505. specify the density to use when formatting a floppy diskette.  See the
  1506. <A HREF="#item_%22%3AMEDIA_TYPE%22"><CODE>":MEDIA_TYPE"</CODE></A> export class for more information.</P>
  1507. <P>The remaining fields specify the starting and ending cylinder and
  1508. head of the range of tracks to be formatted.</P>
  1509. <P></P>
  1510. <DT><STRONG><A NAME="item_IOCTL_DISK_REASSIGN_BLOCKS"><CODE>IOCTL_DISK_REASSIGN_BLOCKS</CODE></A></STRONG><BR>
  1511. <DD>
  1512. Reassign a list of disk blocks to the disk's spare-block pool. 
  1513. <CODE>$opOutBuf</CODE> should be <CODE>[]</CODE>.  <CODE>$pInBuf</CODE> should be a
  1514. <CODE>REASSIGN_BLOCKS</CODE> data structure:
  1515. <PRE>
  1516.     $pInBuf= pack( "S S L*", 0, $cBlocks, @uBlockNumbers );</PRE>
  1517. <P></P>
  1518. <DT><STRONG><A NAME="item_IOCTL_DISK_PERFORMANCE"><CODE>IOCTL_DISK_PERFORMANCE</CODE></A></STRONG><BR>
  1519. <DD>
  1520. Request information about disk performance.  <CODE>$pInBuf</CODE> should be <CODE>[]</CODE>.
  1521. <CODE>$opOutBuf</CODE> will be set to contain a <CODE>DISK_PERFORMANCE</CODE> data structure:
  1522. <PRE>
  1523.     my( $ucBytesReadLow, $ivcBytesReadHigh,
  1524.         $ucBytesWrittenLow, $ivcBytesWrittenHigh,
  1525.         $uReadTimeLow, $ivReadTimeHigh,
  1526.         $uWriteTimeLow, $ivWriteTimeHigh,
  1527.         $ucReads, $ucWrites, $uQueueDepth )=
  1528.         unpack( "L l L l L l L l L L L", $opOutBuf );</PRE>
  1529. <P></P>
  1530. <DT><STRONG><A NAME="item_IOCTL_DISK_IS_WRITABLE"><CODE>IOCTL_DISK_IS_WRITABLE</CODE></A></STRONG><BR>
  1531. <DD>
  1532. No documentation on this IOCTL operation was found.
  1533. <P></P>
  1534. <DT><STRONG><A NAME="item_IOCTL_DISK_LOGGING"><CODE>IOCTL_DISK_LOGGING</CODE></A></STRONG><BR>
  1535. <DD>
  1536. Control disk logging.  Little documentation for this IOCTL operation
  1537. was found.  It makes use of a <CODE>DISK_LOGGING</CODE> data structure:
  1538. <DL>
  1539. <DT><STRONG><A NAME="item_DISK_LOGGING_START">DISK_LOGGING_START</A></STRONG><BR>
  1540. <DD>
  1541. Start logging each disk request in a buffer internal to the disk device
  1542. driver of size <CODE>$uLogBufferSize</CODE>:
  1543. <PRE>
  1544.     $pInBuf= pack( "C L L", 0, 0, $uLogBufferSize );</PRE>
  1545. <P></P>
  1546. <DT><STRONG><A NAME="item_DISK_LOGGING_STOP">DISK_LOGGING_STOP</A></STRONG><BR>
  1547. <DD>
  1548. Stop loggin each disk request:
  1549. <PRE>
  1550.     $pInBuf= pack( "C L L", 1, 0, 0 );</PRE>
  1551. <P></P>
  1552. <DT><STRONG><A NAME="item_DISK_LOGGING_DUMP">DISK_LOGGING_DUMP</A></STRONG><BR>
  1553. <DD>
  1554. Copy the interal log into the supplied buffer:
  1555. <PRE>
  1556.     $pLogBuffer= ' ' x $uLogBufferSize
  1557.     $pInBuf= pack( "C P L", 2, $pLogBuffer, $uLogBufferSize );</PRE>
  1558. <PRE>
  1559.     ( $uByteOffsetLow[$i], $ivByteOffsetHigh[$i],
  1560.       $uStartTimeLow[$i], $ivStartTimeHigh[$i],
  1561.       $uEndTimeLog[$i], $ivEndTimeHigh[$i],
  1562.       $hVirtualAddress[$i], $ucBytes[$i],
  1563.       $uDeviceNumber[$i], $bWasReading[$i] )=
  1564.       unpack( "x".(8+8+8+4+4+1+1+2)." L l L l L l L L C c x2", $pLogBuffer );</PRE>
  1565. <P></P>
  1566. <DT><STRONG><A NAME="item_DISK_LOGGING_BINNING">DISK_LOGGING_BINNING</A></STRONG><BR>
  1567. <DD>
  1568. Keep statics grouped into bins based on request sizes.
  1569. <PRE>
  1570.     $pInBuf= pack( "C P L", 3, $pUnknown, $uUnknownSize );</PRE>
  1571. <P></P></DL>
  1572. <DT><STRONG><A NAME="item_IOCTL_DISK_FORMAT_TRACKS_EX"><CODE>IOCTL_DISK_FORMAT_TRACKS_EX</CODE></A></STRONG><BR>
  1573. <DD>
  1574. No documentation on this IOCTL is included.
  1575. <P></P>
  1576. <DT><STRONG><A NAME="item_IOCTL_DISK_HISTOGRAM_STRUCTURE"><CODE>IOCTL_DISK_HISTOGRAM_STRUCTURE</CODE></A></STRONG><BR>
  1577. <DD>
  1578. No documentation on this IOCTL is included.
  1579. <P></P>
  1580. <DT><STRONG><A NAME="item_IOCTL_DISK_HISTOGRAM_DATA"><CODE>IOCTL_DISK_HISTOGRAM_DATA</CODE></A></STRONG><BR>
  1581. <DD>
  1582. No documentation on this IOCTL is included.
  1583. <P></P>
  1584. <DT><STRONG><A NAME="item_IOCTL_DISK_HISTOGRAM_RESET"><CODE>IOCTL_DISK_HISTOGRAM_RESET</CODE></A></STRONG><BR>
  1585. <DD>
  1586. No documentation on this IOCTL is included.
  1587. <P></P>
  1588. <DT><STRONG><A NAME="item_IOCTL_DISK_REQUEST_STRUCTURE"><CODE>IOCTL_DISK_REQUEST_STRUCTURE</CODE></A></STRONG><BR>
  1589. <DD>
  1590. No documentation on this IOCTL operation was found.
  1591. <P></P>
  1592. <DT><STRONG><A NAME="item_IOCTL_DISK_REQUEST_DATA"><CODE>IOCTL_DISK_REQUEST_DATA</CODE></A></STRONG><BR>
  1593. <DD>
  1594. No documentation on this IOCTL operation was found.
  1595. <P></P></DL>
  1596. <DT><STRONG><A NAME="item_%22%3AGENERIC_%22"><CODE>":GENERIC_"</CODE></A></STRONG><BR>
  1597. <DD>
  1598. Constants specifying generic access permissions that are not specific
  1599. to one type of object.
  1600. <PRE>
  1601.         GENERIC_ALL                     GENERIC_EXECUTE
  1602.         GENERIC_READ                    GENERIC_WRITE</PRE>
  1603. <P></P>
  1604. <DT><STRONG><A NAME="item_%22%3AMEDIA_TYPE%22"><CODE>":MEDIA_TYPE"</CODE></A></STRONG><BR>
  1605. <DD>
  1606. Different classes of media that a device can support.  Used in the
  1607. <A HREF="#item_%24uMediaType"><CODE>$uMediaType</CODE></A> field of a <CODE>DISK_GEOMETRY</CODE> structure.
  1608. <DL>
  1609. <DT><STRONG><A NAME="item_Unknown"><CODE>Unknown</CODE></A></STRONG><BR>
  1610. <DD>
  1611. Format is unknown.
  1612. <P></P>
  1613. <DT><STRONG><A NAME="item_F5_1Pt2_512"><CODE>F5_1Pt2_512</CODE></A></STRONG><BR>
  1614. <DD>
  1615. 5.25`` floppy, 1.2MB total space, 512 bytes/sector.
  1616. <P></P>
  1617. <DT><STRONG><A NAME="item_F3_1Pt44_512"><CODE>F3_1Pt44_512</CODE></A></STRONG><BR>
  1618. <DD>
  1619. 3.5`` floppy, 1.44MB total space, 512 bytes/sector.
  1620. <P></P>
  1621. <DT><STRONG><A NAME="item_F3_2Pt88_512"><CODE>F3_2Pt88_512</CODE></A></STRONG><BR>
  1622. <DD>
  1623. 3.5`` floppy, 2.88MB total space, 512 bytes/sector.
  1624. <P></P>
  1625. <DT><STRONG><A NAME="item_F3_20Pt8_512"><CODE>F3_20Pt8_512</CODE></A></STRONG><BR>
  1626. <DD>
  1627. 3.5`` floppy, 20.8MB total space, 512 bytes/sector.
  1628. <P></P>
  1629. <DT><STRONG><A NAME="item_F3_720_512"><CODE>F3_720_512</CODE></A></STRONG><BR>
  1630. <DD>
  1631. 3.5`` floppy, 720KB total space, 512 bytes/sector.
  1632. <P></P>
  1633. <DT><STRONG><A NAME="item_F5_360_512"><CODE>F5_360_512</CODE></A></STRONG><BR>
  1634. <DD>
  1635. 5.25`` floppy, 360KB total space, 512 bytes/sector.
  1636. <P></P>
  1637. <DT><STRONG><A NAME="item_F5_320_512"><CODE>F5_320_512</CODE></A></STRONG><BR>
  1638. <DD>
  1639. 5.25`` floppy, 320KB total space, 512 bytes/sector.
  1640. <P></P>
  1641. <DT><STRONG><A NAME="item_F5_320_1024"><CODE>F5_320_1024</CODE></A></STRONG><BR>
  1642. <DD>
  1643. 5.25`` floppy, 320KB total space, 1024 bytes/sector.
  1644. <P></P>
  1645. <DT><STRONG><A NAME="item_F5_180_512"><CODE>F5_180_512</CODE></A></STRONG><BR>
  1646. <DD>
  1647. 5.25`` floppy, 180KB total space, 512 bytes/sector.
  1648. <P></P>
  1649. <DT><STRONG><A NAME="item_F5_160_512"><CODE>F5_160_512</CODE></A></STRONG><BR>
  1650. <DD>
  1651. 5.25`` floppy, 160KB total space, 512 bytes/sector.
  1652. <P></P>
  1653. <DT><STRONG><A NAME="item_RemovableMedia"><CODE>RemovableMedia</CODE></A></STRONG><BR>
  1654. <DD>
  1655. Some type of removable media other than a floppy diskette.
  1656. <P></P>
  1657. <DT><STRONG><A NAME="item_FixedMedia"><CODE>FixedMedia</CODE></A></STRONG><BR>
  1658. <DD>
  1659. A fixed hard disk.
  1660. <P></P>
  1661. <DT><STRONG><A NAME="item_F3_120M_512"><CODE>F3_120M_512</CODE></A></STRONG><BR>
  1662. <DD>
  1663. 3.5`` floppy, 120MB total space.
  1664. <P></P></DL>
  1665. <DT><STRONG><A NAME="item_%22%3AMOVEFILE_%22"><CODE>":MOVEFILE_"</CODE></A></STRONG><BR>
  1666. <DD>
  1667. Constants for use in <CODE>$uFlags</CODE> arguments to <A HREF="#item_MoveFileEx"><CODE>MoveFileEx</CODE></A>.
  1668. <PRE>
  1669.         MOVEFILE_COPY_ALLOWED           MOVEFILE_DELAY_UNTIL_REBOOT
  1670.         MOVEFILE_REPLACE_EXISTING       MOVEFILE_WRITE_THROUGH</PRE>
  1671. <P></P>
  1672. <DT><STRONG><A NAME="item_%22%3ASECURITY_%22"><CODE>":SECURITY_"</CODE></A></STRONG><BR>
  1673. <DD>
  1674. Security quality of service values that can be used in the <CODE>$uFlags</CODE>
  1675. argument to <A HREF="#item_CreateFile"><CODE>CreateFile</CODE></A> if opening the client side of a named pipe.
  1676. <PRE>
  1677.         SECURITY_ANONYMOUS              SECURITY_CONTEXT_TRACKING
  1678.         SECURITY_DELEGATION             SECURITY_EFFECTIVE_ONLY
  1679.         SECURITY_IDENTIFICATION         SECURITY_IMPERSONATION
  1680.         SECURITY_SQOS_PRESENT</PRE>
  1681. <P></P>
  1682. <DT><STRONG><A NAME="item_%22%3ASEM_%22"><CODE>":SEM_"</CODE></A></STRONG><BR>
  1683. <DD>
  1684. Constants to be used with <A HREF="#item_SetErrorMode"><CODE>SetErrorMode</CODE></A>.
  1685. <PRE>
  1686.         SEM_FAILCRITICALERRORS          SEM_NOGPFAULTERRORBOX
  1687.         SEM_NOALIGNMENTFAULTEXCEPT      SEM_NOOPENFILEERRORBOX</PRE>
  1688. <P></P>
  1689. <DT><STRONG><A NAME="item_%22%3APARTITION_%22"><CODE>":PARTITION_"</CODE></A></STRONG><BR>
  1690. <DD>
  1691. Constants describing partition types.
  1692. <PRE>
  1693.         PARTITION_ENTRY_UNUSED          PARTITION_FAT_12
  1694.         PARTITION_XENIX_1               PARTITION_XENIX_2
  1695.         PARTITION_FAT_16                PARTITION_EXTENDED
  1696.         PARTITION_HUGE                  PARTITION_IFS
  1697.         PARTITION_FAT32                 PARTITION_FAT32_XINT13
  1698.         PARTITION_XINT13                PARTITION_XINT13_EXTENDED
  1699.         PARTITION_PREP                  PARTITION_UNIX
  1700.         VALID_NTFT                      PARTITION_NTFT</PRE>
  1701. <P></P>
  1702. <DT><STRONG><A NAME="item_%22%3AALL%22"><CODE>":ALL"</CODE></A></STRONG><BR>
  1703. <DD>
  1704. All of the above.
  1705. <P></P></DL>
  1706. <P>
  1707. <HR>
  1708. <H1><A NAME="bugs">BUGS</A></H1>
  1709. <P>None known at this time.</P>
  1710. <P>
  1711. <HR>
  1712. <H1><A NAME="author">AUTHOR</A></H1>
  1713. <P>Tye McQueen, <A HREF="mailto:tye@metronet.com,">tye@metronet.com,</A> <A HREF="http://www.metronet.com/~tye/.">http://www.metronet.com/~tye/.</A></P>
  1714. <P>
  1715. <HR>
  1716. <H1><A NAME="see also">SEE ALSO</A></H1>
  1717. <P>The pyramids.</P>
  1718. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  1719. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  1720. <STRONG><P CLASS=block> Win32API::File - Low-level access to Win32 system API calls for files/dirs.</P></STRONG>
  1721. </TD></TR>
  1722. </TABLE>
  1723.  
  1724. </BODY>
  1725.  
  1726. </HTML>
  1727.