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

  1. # File.pm -- Low-level access to Win32 file/dir functions/constants.
  2.  
  3. package Win32API::File;
  4.  
  5. use strict;
  6. use Carp;
  7. use Fcntl qw( O_RDONLY O_RDWR O_WRONLY O_APPEND O_BINARY O_TEXT );
  8. use vars qw( $VERSION @ISA $AUTOLOAD );
  9. use vars qw( @EXPORT @EXPORT_OK @EXPORT_FAIL %EXPORT_TAGS );
  10. $VERSION= '0.07';
  11.  
  12. require Exporter;
  13. require DynaLoader;
  14. @ISA= qw( Exporter DynaLoader );
  15.  
  16. # Items to export into callers namespace by default. Note: do not export
  17. # names by default without a very good reason. Use EXPORT_OK instead.
  18. # Do not simply export all your public functions/methods/constants.
  19. @EXPORT= qw();
  20. %EXPORT_TAGS= (
  21.     Func =>    [qw(
  22.     attrLetsToBits        createFile        getLogicalDrives
  23.     CloseHandle        CopyFile        CreateFile
  24.     DefineDosDevice        DeleteFile        DeviceIoControl
  25.     FdGetOsFHandle        GetDriveType        GetFileType
  26.     GetLogicalDrives    GetLogicalDriveStrings    GetOsFHandle
  27.     GetVolumeInformation    IsRecognizedPartition    IsContainerPartition
  28.     MoveFile        MoveFileEx        OsFHandleOpen
  29.     OsFHandleOpenFd        QueryDosDevice        ReadFile
  30.     SetFilePointer        SetErrorMode        WriteFile )],
  31.     FuncA =>    [qw(
  32.     CopyFileA        CreateFileA        DefineDosDeviceA
  33.     DeleteFileA        GetDriveTypeA        GetLogicalDriveStringsA
  34.     GetVolumeInformationA    MoveFileA        MoveFileExA
  35.     QueryDosDeviceA )],
  36.     FuncW =>    [qw(
  37.     CopyFileW        CreateFileW        DefineDosDeviceW
  38.     DeleteFileW        GetDriveTypeW        GetLogicalDriveStringsW
  39.     GetVolumeInformationW    MoveFileW        MoveFileExW
  40.     QueryDosDeviceW )],
  41.     Misc =>        [qw(
  42.     CREATE_ALWAYS        CREATE_NEW        FILE_BEGIN
  43.     FILE_CURRENT        FILE_END        INVALID_HANDLE_VALUE
  44.     OPEN_ALWAYS        OPEN_EXISTING        TRUNCATE_EXISTING )],
  45.     DDD_ =>    [qw(
  46.     DDD_EXACT_MATCH_ON_REMOVE            DDD_RAW_TARGET_PATH
  47.     DDD_REMOVE_DEFINITION )],
  48.     DRIVE_ =>    [qw(
  49.     DRIVE_UNKNOWN        DRIVE_NO_ROOT_DIR    DRIVE_REMOVABLE
  50.     DRIVE_FIXED        DRIVE_REMOTE        DRIVE_CDROM
  51.     DRIVE_RAMDISK )],
  52.     FILE_ =>    [qw(
  53.     FILE_READ_DATA            FILE_LIST_DIRECTORY
  54.     FILE_WRITE_DATA            FILE_ADD_FILE
  55.     FILE_APPEND_DATA        FILE_ADD_SUBDIRECTORY
  56.     FILE_CREATE_PIPE_INSTANCE    FILE_READ_EA
  57.     FILE_WRITE_EA            FILE_EXECUTE
  58.     FILE_TRAVERSE            FILE_DELETE_CHILD
  59.     FILE_READ_ATTRIBUTES        FILE_WRITE_ATTRIBUTES
  60.     FILE_ALL_ACCESS            FILE_GENERIC_READ
  61.     FILE_GENERIC_WRITE        FILE_GENERIC_EXECUTE )],
  62.     FILE_ATTRIBUTE_ =>    [qw(
  63.     FILE_ATTRIBUTE_ARCHIVE        FILE_ATTRIBUTE_COMPRESSED
  64.     FILE_ATTRIBUTE_HIDDEN        FILE_ATTRIBUTE_NORMAL
  65.     FILE_ATTRIBUTE_OFFLINE        FILE_ATTRIBUTE_READONLY
  66.     FILE_ATTRIBUTE_SYSTEM        FILE_ATTRIBUTE_TEMPORARY )],
  67.     FILE_FLAG_ =>    [qw(
  68.     FILE_FLAG_BACKUP_SEMANTICS    FILE_FLAG_DELETE_ON_CLOSE
  69.     FILE_FLAG_NO_BUFFERING        FILE_FLAG_OVERLAPPED
  70.     FILE_FLAG_POSIX_SEMANTICS    FILE_FLAG_RANDOM_ACCESS
  71.     FILE_FLAG_SEQUENTIAL_SCAN    FILE_FLAG_WRITE_THROUGH )],
  72.     FILE_SHARE_ =>    [qw(
  73.     FILE_SHARE_DELETE    FILE_SHARE_READ        FILE_SHARE_WRITE )],
  74.     FILE_TYPE_ =>    [qw(
  75.     FILE_TYPE_CHAR        FILE_TYPE_DISK        FILE_TYPE_PIPE
  76.     FILE_TYPE_UNKNOWN )],
  77.     FS_ =>    [qw(
  78.     FS_CASE_IS_PRESERVED        FS_CASE_SENSITIVE
  79.     FS_UNICODE_STORED_ON_DISK    FS_PERSISTENT_ACLS 
  80.     FS_FILE_COMPRESSION        FS_VOL_IS_COMPRESSED )],
  81.     IOCTL_STORAGE_ =>    [qw(
  82.     IOCTL_STORAGE_CHECK_VERIFY        IOCTL_STORAGE_MEDIA_REMOVAL
  83.     IOCTL_STORAGE_EJECT_MEDIA        IOCTL_STORAGE_LOAD_MEDIA
  84.     IOCTL_STORAGE_RESERVE            IOCTL_STORAGE_RELEASE
  85.     IOCTL_STORAGE_FIND_NEW_DEVICES        IOCTL_STORAGE_GET_MEDIA_TYPES
  86.     )],
  87.     IOCTL_DISK_ =>    [qw(
  88.     IOCTL_DISK_GET_DRIVE_GEOMETRY        IOCTL_DISK_GET_PARTITION_INFO
  89.     IOCTL_DISK_SET_PARTITION_INFO        IOCTL_DISK_GET_DRIVE_LAYOUT
  90.     IOCTL_DISK_SET_DRIVE_LAYOUT        IOCTL_DISK_VERIFY
  91.     IOCTL_DISK_FORMAT_TRACKS        IOCTL_DISK_REASSIGN_BLOCKS
  92.     IOCTL_DISK_PERFORMANCE            IOCTL_DISK_IS_WRITABLE
  93.     IOCTL_DISK_LOGGING            IOCTL_DISK_FORMAT_TRACKS_EX
  94.     IOCTL_DISK_HISTOGRAM_STRUCTURE        IOCTL_DISK_HISTOGRAM_DATA
  95.     IOCTL_DISK_HISTOGRAM_RESET        IOCTL_DISK_REQUEST_STRUCTURE
  96.     IOCTL_DISK_REQUEST_DATA )],
  97.     GENERIC_ =>        [qw(
  98.     GENERIC_ALL            GENERIC_EXECUTE
  99.     GENERIC_READ            GENERIC_WRITE )],
  100.     MEDIA_TYPE =>    [qw(
  101.     Unknown            F5_1Pt2_512        F3_1Pt44_512
  102.     F3_2Pt88_512        F3_20Pt8_512        F3_720_512
  103.     F5_360_512        F5_320_512        F5_320_1024
  104.     F5_180_512        F5_160_512        RemovableMedia
  105.     FixedMedia        F3_120M_512 )],
  106.     MOVEFILE_ =>    [qw(
  107.     MOVEFILE_COPY_ALLOWED        MOVEFILE_DELAY_UNTIL_REBOOT
  108.     MOVEFILE_REPLACE_EXISTING    MOVEFILE_WRITE_THROUGH )],
  109.     SECURITY_ =>    [qw(
  110.     SECURITY_ANONYMOUS        SECURITY_CONTEXT_TRACKING
  111.     SECURITY_DELEGATION        SECURITY_EFFECTIVE_ONLY
  112.     SECURITY_IDENTIFICATION        SECURITY_IMPERSONATION
  113.     SECURITY_SQOS_PRESENT )],
  114.     SEM_ =>        [qw(
  115.     SEM_FAILCRITICALERRORS        SEM_NOGPFAULTERRORBOX
  116.     SEM_NOALIGNMENTFAULTEXCEPT    SEM_NOOPENFILEERRORBOX )],
  117.     PARTITION_ =>    [qw(
  118.     PARTITION_ENTRY_UNUSED        PARTITION_FAT_12
  119.     PARTITION_XENIX_1        PARTITION_XENIX_2
  120.     PARTITION_FAT_16        PARTITION_EXTENDED
  121.     PARTITION_HUGE            PARTITION_IFS
  122.     PARTITION_FAT32            PARTITION_FAT32_XINT13
  123.     PARTITION_XINT13        PARTITION_XINT13_EXTENDED
  124.     PARTITION_PREP            PARTITION_UNIX
  125.     VALID_NTFT            PARTITION_NTFT )],
  126. );
  127. @EXPORT_OK= ();
  128. {   my $key;
  129.     foreach $key (  keys(%EXPORT_TAGS)  ) {
  130.     push( @EXPORT_OK, @{$EXPORT_TAGS{$key}} );
  131.     push( @EXPORT_FAIL, @{$EXPORT_TAGS{$key}} )   unless  $key =~ /^Func/;
  132.     }
  133. }
  134. $EXPORT_TAGS{ALL}= \@EXPORT_OK;
  135.  
  136. sub export_fail {
  137.     my $self= shift @_;
  138.     my( $sym, $val, @failed );
  139.     foreach $sym (  @_  ) {
  140.     $!= 0;
  141.     $val= constant($sym);
  142.     if(  0 == $!  ) {
  143.         eval "sub $sym () { $val }";
  144.     } elsif(  $! =~ /Invalid/  ) {
  145.         die "Non-constant ($sym) appears in \@EXPORT_FAIL",
  146.           " (this module is broken)";
  147.     } else {
  148.         push( @failed, $sym );
  149.     }
  150.     }
  151.     return @failed;
  152. }
  153.  
  154. #######################################################################
  155. # This AUTOLOAD is used to 'autoload' constants from the constant()
  156. # XS function.  If a constant is not found then control is passed
  157. # to the AUTOLOAD in AutoLoader.
  158.  
  159. sub AUTOLOAD {
  160.     my($constname);
  161.     ($constname = $AUTOLOAD) =~ s/.*:://;
  162.     #reset $! to zero to reset any current errors.
  163.     $!=0;
  164.     my $val = constant($constname);
  165.     if ($! != 0) {
  166.     if ($! =~ /Invalid/) {
  167.         $AutoLoader::AUTOLOAD = $AUTOLOAD;
  168.         goto &AutoLoader::AUTOLOAD;
  169.     }
  170.     else {
  171.         my($pack,$file,$line)= caller;
  172.         die "Your vendor has not defined Win32::Misc macro $constname,",
  173.             " used at $file line $line.";
  174.     }
  175.     }
  176.     eval "sub $AUTOLOAD () { $val }";
  177.     goto &$AUTOLOAD;
  178. }
  179.  
  180. bootstrap Win32API::File $VERSION;
  181.  
  182. # Preloaded methods go here.
  183.  
  184. # Replace "&rout;" with "goto &rout;" when that is supported on Win32.
  185.  
  186. # Aliases for non-Unicode functions:
  187. sub CopyFile            { &CopyFileA; }
  188. sub CreateFile            { &CreateFileA; }
  189. sub DefineDosDevice        { &DefineDosDeviceA; }
  190. sub DeleteFile            { &DeleteFileA; }
  191. sub GetDriveType        { &GetDriveTypeA; }
  192. sub GetLogicalDriveStrings    { &GetLogicalDriveStringsA; }
  193. sub GetVolumeInformation    { &GetVolumeInformationA; }
  194. sub MoveFile            { &MoveFileA; }
  195. sub MoveFileEx            { &MoveFileExA; }
  196. sub QueryDosDevice        { &QueryDosDeviceA; }
  197.  
  198. sub OsFHandleOpen {
  199.     if(  3 != @_  ) {
  200.     croak 'Win32API::File Usage:  ',
  201.           'OsFHandleOpen(FILE,$hNativeHandle,"rwatb")';
  202.     }
  203.     my( $fh, $osfh, $access )= @_;
  204.     if(  ! ref($fh)  ) {
  205.     if(  $fh !~ /('|::)/  ) {
  206.         $fh= caller() . "::" . $fh;
  207.     }
  208.     no strict "refs";
  209.     $fh= \*{$fh};
  210.     }
  211.     my( $mode, $pref );
  212.     if(  $access =~ /r/i  ) {
  213.     if(  $access =~ /w/i  ) {
  214.         $mode= O_RDWR;
  215.         $pref= "+<";
  216.     } else {
  217.         $mode= O_RDONLY;
  218.         $pref= "<";
  219.     }
  220.     } else {
  221.     if(  $access =~ /w/i  ) {
  222.         $mode= O_WRONLY;
  223.         $pref= ">";
  224.     } else {
  225.     #   croak qq<Win32API::File::OsFHandleOpen():  >,
  226.     #      qq<Access ($access) missing both "r" and "w">;
  227.         $mode= O_RDONLY;
  228.         $pref= "<";
  229.     }
  230.     }
  231.     $mode |= O_APPEND   if  $access =~ /a/i;
  232.     #$mode |= O_TEXT   if  $access =~ /t/i;
  233.     # Some versions of the Fcntl module are broken and won't autoload O_TEXT:
  234.     if(  $access =~ /t/i  ) {
  235.     my $o_text= eval "O_TEXT";
  236.     $o_text= 0x4000   if  $@;
  237.     $mode |= $o_text;
  238.     }
  239.     $mode |= O_BINARY   if  $access =~ /b/i;
  240.     my( $fd )= OsFHandleOpenFd( $osfh, $mode )
  241.       or  return ();
  242.     return  open( $fh, $pref."&=".$fd );
  243. }
  244.  
  245. sub GetOsFHandle {
  246.     if(  1 != @_  ) {
  247.     croak 'Win32API::File Usage:  $OsFHandle= GetOsFHandle(FILE)';
  248.     }
  249.     my( $file )= @_;
  250.     if(  ! ref($file)  ) {
  251.     if(  $file !~ /('|::)/  ) {
  252.         $file= caller() . "::" . $file;
  253.     }
  254.     no strict "refs";
  255.     $file= \*{$file};
  256.     }
  257.     my( $fd )= fileno($file);
  258.     if(  ! defined( $fd )  ) {
  259.     if(  $file =~ /^\d+\Z/  ) {
  260.         $fd= $file;
  261.     } else {
  262.         return ();    # $! should be set by fileno().
  263.     }
  264.     }
  265.     return FdGetOsFHandle( $fd );
  266. }
  267.  
  268. sub attrLetsToBits
  269. {
  270.     my( $lets )= @_;
  271.     my( %a )= (
  272.       "a"=>FILE_ATTRIBUTE_ARCHIVE(),    "c"=>FILE_ATTRIBUTE_COMPRESSED(),
  273.       "h"=>FILE_ATTRIBUTE_HIDDEN(),    "o"=>FILE_ATTRIBUTE_OFFLINE(),
  274.       "r"=>FILE_ATTRIBUTE_READONLY(),    "s"=>FILE_ATTRIBUTE_SYSTEM(),
  275.       "t"=>FILE_ATTRIBUTE_TEMPORARY() );
  276.     my( $bits )= 0;
  277.     foreach(  split(//,$lets)  ) {
  278.     croak "Win32API::File::attrLetsToBits: Unknown attribute letter ($_)"
  279.       unless  exists $a{$_};
  280.     $bits |= $a{$_};
  281.     }
  282.     return $bits;
  283. }
  284.  
  285. use vars qw( @_createFile_Opts %_createFile_Opts );
  286. @_createFile_Opts= qw( Access Create Share Attributes
  287.                Flags Security Model );
  288. @_createFile_Opts{@_createFile_Opts}= (1) x @_createFile_Opts;
  289.  
  290. sub createFile
  291. {
  292.     my $opts= "";
  293.     if(  2 <= @_  &&  "HASH" eq ref($_[$#_])  ) {
  294.     $opts= pop( @_ );
  295.     }
  296.     my( $sPath, $svAccess, $svShare )= @_;
  297.     if(  @_ < 1  ||  3 < @_  ) {
  298.     croak "Win32API::File::createFile() usage:  \$hObject= createFile(\n",
  299.           "  \$sPath, [\$svAccess_qrw_ktn_ce,[\$svShare_rwd,]]",
  300.           " [{Option=>\$Value}] )\n",
  301.           "    options: @_createFile_Opts\nCalled";
  302.     }
  303.     my( $create, $flags, $sec, $model )= ( "", 0, [], 0 );
  304.     if(  ref($opts)  ) {
  305.         my @err= grep( ! $_createFile_Opts{$_}, keys(%$opts) );
  306.     @err  and  croak "_createFile:  Invalid options (@err)";
  307.     $flags= $opts->{Flags}        if  exists( $opts->{Flags} );
  308.     $flags |= attrLetsToBits( $opts->{Attributes} )
  309.                     if  exists( $opts->{Attributes} );
  310.     $sec= $opts->{Security}        if  exists( $opts->{Security} );
  311.     $model= $opts->{Model}        if  exists( $opts->{Model} );
  312.     $svAccess= $opts->{Access}    if  exists( $opts->{Access} );
  313.     $create= $opts->{Create}    if  exists( $opts->{Create} );
  314.     $svShare= $opts->{Share}    if  exists( $opts->{Share} );
  315.     }
  316.     $svAccess= "r"        unless  defined($svAccess);
  317.     $svShare= "rw"        unless  defined($svShare);
  318.     if(  $svAccess =~ /^[qrw ktn ce]*$/i  ) {
  319.     ( my $c= $svAccess ) =~ tr/qrw QRW//d;
  320.     $create= $c   if  "" ne $c  &&  "" eq $create;
  321.     local( $_ )= $svAccess;
  322.     $svAccess= 0;
  323.     $svAccess |= GENERIC_READ()   if  /r/i;
  324.     $svAccess |= GENERIC_WRITE()   if  /w/i;
  325.     } elsif(  "?" eq $svAccess  ) {
  326.     croak
  327.       "Win32API::File::createFile:  \$svAccess can use the following:\n",
  328.           "    One or more of the following:\n",
  329.           "\tq -- Query access (same as 0)\n",
  330.           "\tr -- Read access (GENERIC_READ)\n",
  331.           "\tw -- Write access (GENERIC_WRITE)\n",
  332.           "    At most one of the following:\n",
  333.           "\tk -- Keep if exists\n",
  334.           "\tt -- Truncate if exists\n",
  335.           "\tn -- New file only (fail if file already exists)\n",
  336.           "    At most one of the following:\n",
  337.           "\tc -- Create if doesn't exist\n",
  338.           "\te -- Existing file only (fail if doesn't exist)\n",
  339.           "  ''   is the same as 'q  k e'\n",
  340.           "  'r'  is the same as 'r  k e'\n",
  341.           "  'w'  is the same as 'w  t c'\n",
  342.           "  'rw' is the same as 'rw k c'\n",
  343.           "  'rt' or 'rn' implies 'c'.\n",
  344.           "  Or \$svAccess can be numeric.\n", "Called from";
  345.     } elsif(  $svAccess == 0  &&  $svAccess !~ /^[-+.]*0/  ) {
  346.     croak "Win32API::File::createFile:  Invalid \$svAccess ($svAccess)";
  347.     }
  348.     if(  $create =~ /^[ktn ce]*$/  ) {
  349.         local( $_ )= $create;
  350.         my( $k, $t, $n, $c, $e )= ( scalar(/k/i), scalar(/t/i),
  351.       scalar(/n/i), scalar(/c/i), scalar(/e/i) );
  352.     if(  1 < $k + $t + $n  ) {
  353.         croak "Win32API::File::createFile: \$create must not use ",
  354.           qq<more than one of "k", "t", and "n" ($create)>;
  355.     }
  356.     if(  $c  &&  $e  ) {
  357.         croak "Win32API::File::createFile: \$create must not use ",
  358.           qq<both "c" and "e" ($create)>;
  359.     }
  360.     my $r= ( $svAccess & GENERIC_READ() ) == GENERIC_READ();
  361.     my $w= ( $svAccess & GENERIC_WRITE() ) == GENERIC_WRITE();
  362.     if(  ! $k  &&  ! $t  &&  ! $n  ) {
  363.         if(  $w  &&  ! $r  ) {        $t= 1;
  364.         } else {                $k= 1; }
  365.     }
  366.     if(  $k  ) {
  367.         if(  $c  ||  $w && ! $e  ) {    $create= OPEN_ALWAYS();
  368.         } else {                $create= OPEN_EXISTING(); }
  369.     } elsif(  $t  ) {
  370.         if(  $e  ) {            $create= TRUNCATE_EXISTING();
  371.         } else {                $create= CREATE_ALWAYS(); }
  372.     } else { # $n
  373.         if(  ! $e  ) {            $create= CREATE_NEW();
  374.         } else {
  375.         croak "Win32API::File::createFile: \$create must not use ",
  376.           qq<both "n" and "e" ($create)>;
  377.         }
  378.     }
  379.     } elsif(  "?" eq $create  ) {
  380.     croak 'Win32API::File::createFile: $create !~ /^[ktn ce]*$/;',
  381.           ' pass $svAccess as "?" for more information.';
  382.     } elsif(  $create == 0  &&  $create ne "0"  ) {
  383.     croak "Win32API::File::createFile: Invalid \$create ($create)";
  384.     }
  385.     if(  $svShare =~ /^[drw]*$/  ) {
  386.         my %s= ( "d"=>FILE_SHARE_DELETE(), "r"=>FILE_SHARE_READ(),
  387.              "w"=>FILE_SHARE_WRITE() );
  388.         my @s= split(//,$svShare);
  389.     $svShare= 0;
  390.     foreach( @s ) {
  391.         $svShare |= $s{$_};
  392.     }
  393.     } elsif(  $svShare == 0  &&  $svShare !~ /^[-+.]*0/  ) {
  394.     croak "Win32API::File::createFile: Invalid \$svShare ($svShare)";
  395.     }
  396.     return  CreateFileA(
  397.           $sPath, $svAccess, $svShare, $sec, $create, $flags, $model );
  398. }
  399.  
  400.  
  401. sub getLogicalDrives
  402. {
  403.     my( $ref )= @_;
  404.     my $s= "";
  405.     if(  ! GetLogicalDriveStringsA( 256, $s )  ) {
  406.     return undef;
  407.     }
  408.     if(  ! defined($ref)  ) {
  409.     return  split( /\0/, $s );
  410.     } elsif(  "ARRAY" ne ref($ref)  ) {
  411.     croak 'Usage:  C<@arr= getLogicalDrives()> ',
  412.           'or C<getLogicalDrives(\\@arr)>', "\n";
  413.     }
  414.     @$ref= split( /\0/, $s );
  415.     return $ref;
  416. }
  417.  
  418. # Autoload methods go after =cut, and are processed by the autosplit program.
  419.  
  420. 1;
  421. __END__
  422.  
  423. =head1 NAME
  424.  
  425. Win32API::File - Low-level access to Win32 system API calls for files/dirs.
  426.  
  427. =head1 SYNOPSIS
  428.  
  429.   use Win32API::File 0.02 qw( :ALL );
  430.  
  431.   MoveFile( $Source, $Destination )
  432.     or  die "Can't move $Source to $Destination: $^E\n";
  433.   MoveFileEx( $Source, $Destination, MOVEFILE_REPLACE_EXISTING() )
  434.     or  die "Can't move $Source to $Destination: $^E\n";
  435.  
  436. =head1 DESCRIPTION
  437.  
  438. This provides fairly low-level access to the Win32 System API
  439. calls dealing with files and directories.
  440.  
  441. To pass in C<NULL> as the pointer to an optional buffer, pass in
  442. an empty list reference, C<[]>.
  443.  
  444. Beyond raw access to the API calls and related constants, this module
  445. handles smart buffer allocation and translation of return codes.
  446.  
  447. All functions, unless otherwise noted, return a true value for success
  448. and a false value for failure and set C<$^E> on failure.
  449.  
  450. =head2 Exports
  451.  
  452. Nothing is exported by default.  The following tags can be used to
  453. have large sets of symbols exported:  C<":Func">, C<":FuncA">,
  454. C<":FuncW">, C<":Misc">, C<":DDD_">, C<":DRIVE_">, C<":FILE_">,
  455. C<":FILE_ATTRIBUTE_">, C<":FILE_FLAG_">, C<":FILE_SHARE_">,
  456. C<":FILE_TYPE_">, C<":FS_">, C<":IOCTL_STORAGE_">, C<":IOCTL_DISK_">,
  457. C<":GENERIC_">, C<":MEDIA_TYPE">, C<":MOVEFILE_">, C<":SECURITY_">,
  458. C<":SEM_">, and C<":PARTITION_">.
  459.  
  460. =over
  461.  
  462. =item C<":Func">
  463.  
  464. The basic function names: C<attrLetsToBits>, C<createFile>,
  465. C<getLogicalDrives>, C<CloseHandle>, C<CopyFile>, C<CreateFile>,
  466. C<DeleteFile>, C<DefineDosDevice>, C<DeviceIoControl>,
  467. C<FdGetOsFHandle>, C<GetDriveType>, C<GetFileType>, C<GetLogicalDrives>,
  468. C<GetLogicalDriveStrings>, C<GetOsFHandle>, C<GetVolumeInformation>,
  469. C<IsRecognizedPartition>, C<IsContainerPartition>, C<MoveFile>,
  470. C<MoveFileEx>, C<OsFHandleOpen>, C<OsFHandleOpenFd>, C<QueryDosDevice>,
  471. C<ReadFile>, C<SetFilePointer>, C<SetErrorMode>, and C<WriteFile>.
  472.  
  473. =over
  474.  
  475. =item attrLetsToBits
  476.  
  477. =item C<$uBits= attrLetsToBits( $sAttributeLetters )>
  478.  
  479. Converts a string of file attribute letters into an unsigned value with
  480. the corresponding bits set.  C<$sAttributeLetters> should contain zero
  481. or more letters from C<"achorst">:
  482.  
  483. =over
  484.  
  485. =item C<"a">
  486.  
  487. C<FILE_ATTRIBUTE_ARCHIVE>
  488.  
  489. =item C<"c">
  490.  
  491. C<FILE_ATTRIBUTE_COMPRESSED>
  492.  
  493. =item C<"h">
  494.  
  495. C<FILE_ATTRIBUTE_HIDDEN>
  496.  
  497. =item C<"o">
  498.  
  499. C<FILE_ATTRIBUTE_OFFLINE>
  500.  
  501. =item C<"r">
  502.  
  503. C<FILE_ATTRIBUTE_READONLY>
  504.  
  505. =item C<"s">
  506.  
  507. C<FILE_ATTRIBUTE_SYSTEM>
  508.  
  509. =item C<"t">
  510.  
  511. C<FILE_ATTRIBUTE_TEMPORARY>
  512.  
  513. =back
  514.  
  515. =item createFile
  516.  
  517. =item C<$hObject= createFile( $sPath )>
  518.  
  519. =item C<$hObject= createFile( $sPath, $rvhvOptions )>
  520.  
  521. =item C<$hObject= createFile( $sPath, $svAccess )>
  522.  
  523. =item C<$hObject= createFile( $sPath, $svAccess, $rvhvOptions )>
  524.  
  525. =item C<$hObject= createFile( $sPath, $svAccess, $svShare )>
  526.  
  527. =item C<$hObject= createFile( $sPath, $svAccess, $svShare, $rvhvOptions )>
  528.  
  529. This is a Perl-friendly wrapper around C<CreateFile>.
  530.  
  531. On failure, C<$hObject> gets set to a false value and C<$^E> is set
  532. to the reason for the failure.  Otherwise, C<$hObject> gets set to
  533. a Win32 native file handle which is alwasy a true value [returns
  534. C<"0 but true"> in the impossible case of the handle having a value
  535. of C<0>].
  536.  
  537. C<$sPath> is the path to the file [or device, etc.] to be opened.  See
  538. C<CreateFile> for more information on possible special values for
  539. C<$sPath>.  
  540.  
  541. C<$svAccess> can be a number containing the bit mask representing the
  542. specific type(s) of access to the file that you desire.  See the C<$uAccess>
  543. parameter to C<CreateFile> for more information on these values.
  544.  
  545. More likely, C<$svAccess> is a string describing the generic type of access
  546. you desire and possibly the file creation options to use.  In this case,
  547. C<$svAccess> should contain zero or more characters from C<"qrw"> [access
  548. desired], zero or one character each from C<"ktn"> and C<"ce">, and optional
  549. white space.  These letters stand for, respectively, "Query access", "Read
  550. access", "Write access", "Keep if exists", "Truncate if exists", "New file
  551. only", "Create if none", and "Existing file only".  Case is ignored.
  552.  
  553. You can pass in C<"?"> for C<$svAccess> to have an error message displayed
  554. summarizing its possible values.  This is very handy when doing on-the-fly
  555. programming using the Perl debugger:
  556.  
  557.     Win32API::File::createFile:  $svAccess can use the following:
  558.     One or more of the following:
  559.         q -- Query access (same as 0)
  560.         r -- Read access (GENERIC_READ)
  561.         w -- Write access (GENERIC_WRITE)
  562.     At most one of the following:
  563.         k -- Keep if exists
  564.         t -- Truncate if exists
  565.         n -- New file only (fail if file already exists)
  566.     At most one of the following:
  567.         c -- Create if doesn't exist
  568.         e -- Existing file only (fail if doesn't exist)
  569.       ''   is the same as 'q  k e'
  570.       'r'  is the same as 'r  k e'
  571.       'w'  is the same as 'w  t c'
  572.       'rw' is the same as 'rw k c'
  573.       'rt' or 'rn' implies 'c'.
  574.       Or $access can be numeric.
  575.  
  576. C<$svAccess> is designed to be "do what I mean", so you can skip the rest of
  577. its explanation unless you are interested in the complex details.  Note
  578. that, if you want write access to a device, you need to specify C<"k"> and
  579. C<"e"> [as in C<"w ke"> or C<"rw ke">] since Win32 requires C<OPEN_EXISTING>
  580. be used when opening a device.
  581.  
  582. =over
  583.  
  584. =item C<"q"> 
  585.  
  586. Stands for "Query access".  This is really a no-op since you always have
  587. query access when you open a file.  You can specify C<"q"> to document
  588. that you plan to query the file [or device, etc.].  This is especially
  589. helpful when you don't want read nor write access since something like
  590. C<"q"> or C<"q ke"> may be easier to understand than just C<""> or C<"ke">.
  591.  
  592. =item C<"r">
  593.  
  594. Stands for "Read access".  Sets the C<GENERIC_READ> bit(s) in the
  595. C<$uAccess> that is passed to C<CreateFile>.  This is the default
  596. access if the C<$svAccess> parameter is missing or is C<undef> and
  597. if not overridden by C<$rvhvOptions>.
  598.  
  599. =item C<"w">
  600.  
  601. Stands for "Write access".  Sets the C<GENERIC_WRITE> bit(s) in the
  602. C<$uAccess> that is passed to C<CreateFile>.
  603.  
  604. =item C<"k">
  605.  
  606. Stands for "Keep if exists".  If the requested file exists, then it is
  607. opened.  This is the default unless C<GENERIC_WRITE> access has been
  608. requested but C<GENERIC_READ> access has not been requested.   Contrast
  609. with C<"t"> and C<"n">.
  610.  
  611. =item C<"t">
  612.  
  613. Stands for "Truncate if exists".  If the requested file exists, then
  614. it is truncated to zero length and then opened.  This is the default if
  615. C<GENERIC_WRITE> access has been requested and C<GENERIC_READ> access has
  616. not been requested.  Contrast with C<"k"> and C<"n">.
  617.  
  618. =item C<"n">
  619.  
  620. Stands for "New file only".  If the requested file exists, then it is
  621. not opened and the C<createFile> call fails.  Contrast with C<"k"> and
  622. C<"t">.  Can't be used with C<"e">.
  623.  
  624. =item C<"c">
  625.  
  626. Stands for "Create if none".  If the requested file does not exist, then
  627. it is created and then opened.  This is the default if C<GENERIC_WRITE>
  628. access has been requested or if C<"t"> or C<"n"> was specified.  Contrast
  629. with C<"e">.
  630.  
  631. =item C<"e">
  632.  
  633. Stands for "Existing file only".  If the requested file does not exist, then
  634. nothing is opened and the C<createFile> call fails.  This is the default
  635. unless C<GENERIC_WRITE> access has been requested or C<"t"> or C<"n"> was
  636. specified.   Contrast with C<"c">.   Can't be used with C<"n">.
  637.  
  638. =back
  639.  
  640. The characters from C<"ktn"> and C<"ce"> are combined to determine the
  641. what value for C<$uCreate> to pass to C<CreateFile> [unless overridden
  642. by C<$rvhvOptions>]:
  643.  
  644. =over
  645.  
  646. =item C<"kc">
  647.  
  648. C<OPEN_ALWAYS>
  649.  
  650. =item C<"ke">
  651.  
  652. C<OPEN_EXISTING>
  653.  
  654. =item C<"tc">
  655.  
  656. C<TRUNCATE_EXISTING>
  657.  
  658. =item C<"te">
  659.  
  660. C<CREATE_ALWAYS>
  661.  
  662. =item C<"nc">
  663.  
  664. C<CREATE_NEW>
  665.  
  666. =item C<"ne">
  667.  
  668. Illegal.
  669.  
  670. =back
  671.  
  672. C<$svShare> controls how the file is shared, that is, whether other
  673. processes can have read, write, and/or delete access to the file while
  674. we have it opened.  C<$svShare> will usually be a string containing zero
  675. or more characters from C<"rwd"> but can also be a numeric bit mask.
  676.  
  677. C<"r"> sets the C<FILE_SHARE_READ> bit which allows other processes to have
  678. read access to the file.  C<"w"> sets the C<FILE_SHARE_WRITE> bit which
  679. allows other processes to have write access to the file.  C<"d"> sets the
  680. C<FILE_SHARE_DELETE> bit which allows other processes to have delete access
  681. to the file [ignored under Windows 95].
  682.  
  683. The default for C<$svShare> is C<"rw"> which provides the same sharing as
  684. using regular perl C<open()>.
  685.  
  686. If another process currently has read, write, and/or delete access to
  687. the file and you don't allow that level of sharing, then your call to
  688. C<createFile> will fail.  If you requested read, write, and/or delete
  689. access and another process already has the file open but doesn't allow
  690. that level of sharing, thenn your call to C<createFile> will fail.  Once
  691. you have the file open, if another process tries to open it with read,
  692. write, and/or delete access and you don't allow that level of sharing,
  693. then that process won't be allowed to open the file.
  694.  
  695. C<$rvhvOptions> is a reference to a hash where any keys must be from
  696. the list C<qw( Access Create Share Attributes Flags Security Model )>.
  697. The meaning of the value depends on the key name, as described below.
  698. Any option values in C<$rvhvOptions> override the settings from C<$svAccess>
  699. and C<$svShare> if they conflict.
  700.  
  701. =over
  702.  
  703. =item Flags => $uFlags
  704.  
  705. C<$uFlags> is an unsigned value having any of the C<FILE_FLAG_*> or
  706. C<FILE_ATTRIBUTE_*> bits set.  Any C<FILE_ATTRIBUTE_*> bits set via the
  707. C<Attributes> option are logically C<or>ed with these bits.  Defaults
  708. to C<0>.
  709.  
  710. If opening the client side of a named pipe, then you can also specify
  711. C<SECURITY_SQOS_PRESENT> along with one of the other C<SECURITY_*>
  712. constants to specify the security quality of service to be used.
  713.  
  714. =item Attributes => $sAttributes
  715.  
  716. A string of zero or more characters from C<"achorst"> [see C<attrLetsToBits>
  717. for more information] which are converted to C<FILE_ATTRIBUTE_*> bits to
  718. be set in the C<$uFlags> argument passed to C<CreateFile>.
  719.  
  720. =item Security => $pSecurityAttributes
  721.  
  722. C<$pSecurityAttributes> should contain a C<SECURITY_ATTRIBUTES> structure
  723. packed into a string or C<[]> [the default].
  724.  
  725. =item Model => $hModelFile
  726.  
  727. C<$hModelFile> should contain a handle opened with C<GENERIC_READ>
  728. access to a model file from which file attributes and extended attributes
  729. are to be copied.  Or C<$hModelFile> can be C<0> [the default].
  730.  
  731. =item Access => $sAccess
  732.  
  733. =item Access => $uAccess
  734.  
  735. C<$sAccess> should be a string of zero or more characters from
  736. C<"qrw"> specifying the type of access desired:  "query" or C<0>,
  737. "read" or C<GENERIC_READ> [the default], or "write" or
  738. C<GENERIC_WRITE>.
  739.  
  740. C<$uAccess> should be an unsigned value containing bits set to
  741. indicate the type of access desired.  C<GENERIC_READ> is the default.
  742.  
  743. =item Create => $sCreate
  744.  
  745. =item Create => $uCreate
  746.  
  747. C<$sCreate> should be a string constaing zero or one character from
  748. C<"ktn"> and zero or one character from C<"ce">.  These stand for
  749. "keep if exists", "truncate if exists", "new file only", "create if
  750. none", and "existing file only".  These are translated into a
  751. C<$uCreate> value.
  752.  
  753. C<$uCreate> should be one of C<OPEN_ALWAYS>, C<OPEN_EXISTING>,
  754. C<TRUNCATE_EXISTING>, C<CREATE_ALWAYS>, or C<CREATE_NEW>.
  755.  
  756. =item Share => $sShare
  757.  
  758. =item Share => $uShare
  759.  
  760. C<$sShare> should be a string with zero or more characters from
  761. C<"rwd"> that is translated into a C<$uShare> value.  C<"rw"> is
  762. the default.
  763.  
  764. C<$uShare> should be an unsigned value having zero or more of the
  765. following bits set:  C<FILE_SHARE_READ>, C<FILE_SHARE_WRITE>, and
  766. C<FILE_SHARE_DELETE>.  C<FILE_SHARE_READ|FILE_SHARE_WRITE> is the
  767. default.
  768.  
  769. =back
  770.  
  771. Examples:
  772.  
  773.     $hFlop= createFile( "//./A:", "r", "r" )
  774.       or  die "Can't prevent others from writing to floppy: $^E\n";
  775.     $hDisk= createFile( "//./C:", "rw ke", "" )
  776.       or  die "Can't get exclusive access to C: $^E\n";
  777.     $hDisk= createFile( $sFilePath, "ke",
  778.       { Access=>FILE_READ_ATTRIBUTES } )
  779.       or  die "Can't read attributes of $sFilePath: $^E\n";
  780.     $hTemp= createFile( "$ENV{Temp}/temp.$$", "wn", "",
  781.       { Attributes=>"hst", Flags=>FILE_FLAG_DELETE_ON_CLOSE() } )
  782.       or  die "Can't create temporary file, temp.$$: $^E\n";
  783.  
  784. =item getLogicalDrives
  785.  
  786. =item C<@roots= getLogicalDrives()>
  787.  
  788. Returns the paths to the root directories of all logical drives
  789. currently defined.  This includes all types of drive lettters, such
  790. as floppies, CD-ROMs, hard disks, and network shares.  A typical
  791. return value on a poorly equipped computer would be C<("A:\\","C:\\")>.
  792.  
  793. =item CloseHandle
  794.  
  795. =item C<CloseHandle( $hObject )>
  796.  
  797. Closes a Win32 native handle, such as one opened via C<CreateFile>. 
  798. Like most routines, if it fails then it returns a false value and sets
  799. C<$^E> to indicate the reason for the failure.   Returns a true value
  800. for success.
  801.  
  802. =item CopyFile
  803.  
  804. =item C<CopyFile( $sOldFileName, $sNewFileName, $bFailIfExists )>
  805.  
  806. C<$sOldFileName> is the path to the file to be copied.  C<$sNewFileName>
  807. is the path to where the file should be copied.  Note that you can E<NOT>
  808. just specify a path to a directory in C<$sNewFileName> to copy the
  809. file to that directory using the same file name.
  810.  
  811. If C<$bFailIfExists> is true and C<$sNewFileName> is the path to a
  812. file that already exists, then C<CopyFile> will fail.  If
  813. C<$bFailIfExists> is falsea, then the copy of the C<$sOldFileNmae>
  814. file will overwrite the C<$sNewFileName> file if it already exists.
  815.  
  816. =item CreateFile
  817.  
  818. =item C<$hObject= CreateFile( $sPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )>
  819.  
  820. On failure, C<$hObject> gets set to a false value and C<$^E> is set
  821. to the reason for the failure.  Otherwise, C<$hObject> gets set to
  822. a Win32 native file handle which is alwasy a true value [returns
  823. C<"0 but true"> in the impossible case of the handle having a value
  824. of C<0>].
  825.  
  826. C<$sPath> is the path to the file [or device, etc.] to be opened.
  827.  
  828. C<$sPath> can use C<"/"> or C<"\\"> as path delimiters and can even
  829. mix the two.  We will usually only use C<"/"> in our examples since
  830. using C<"\\"> is usually harder to read.
  831.  
  832. Under Windows NT, C<$sPath> can start with C<"//?/"> to allow the use
  833. of paths longer than C<MAX_PATH> [for UNC paths, replace the leading
  834. C<"//"> with C<"//?/UNC/">, as in C<"//?/UNC/Server/Share/Dir/File.Ext">].
  835.  
  836. C<$sPath> can start with C<"//./"> to indicate that the rest of the path
  837. is the name of a "DOS device."  You can use C<QueryDosDevice> to list
  838. all current DOS devices and can add or delete them with C<DefineDosDevice>.
  839.  
  840. The most common such DOS devices include:
  841.  
  842. =over
  843.  
  844. =item C<"//./PhysicalDrive0">
  845.  
  846. Your entire first hard disk.  Doesn't work under Windows 95.  This
  847. allows you to read or write raw sectors of your hard disk and to use
  848. C<DeviceIoControl> to perform miscellaneous queries and operations
  849. to the hard disk.   Writing raw sectors and certain other operations
  850. can seriously damage your files or the function of your computer.
  851.  
  852. Locking this for exclusive access [by specifying C<0> for C<$uShare>]
  853. doesn't prevent access to the partitions on the disk nor their file
  854. systems.  So other processes can still access any raw sectors within
  855. a partition and can use the file system on the disk as usual.
  856.  
  857. =item C<"//./C:">
  858.  
  859. Your F<C:> partition.  Doesn't work under Windows 95.  This allows
  860. you to read or write raw sectors of that partition and to use
  861. C<DeviceIoControl> to perform miscellaneous queries and operations
  862. to the sector.  Writing raw sectors and certain other operations
  863. can seriously damage your files or the function of your computer.
  864.  
  865. Locking this for exclusive access doesn't prevent access to the
  866. physical drive that the partition is on so other processes can
  867. still access the raw sectors that way.  Locking this for exclusive
  868. access E<does> prevent other processes from opening the same raw
  869. partition and E<does> prevent access to the file system on it.  It
  870. even prevents the current process from accessing the file system on
  871. that partition.
  872.  
  873. =item C<"//./A:">
  874.  
  875. The raw floppy disk.  Doesn't work under Windows 95.  This allows you
  876. to read or write raw sectors of the floppy disk and to use
  877. C<DeviceIoControl> to perform miscellaneous queries and operations
  878. to the floopy disk or drive.
  879.  
  880. Locking this for exclusive access prevents all access to the floppy.
  881.  
  882. =item C<"//./PIPE/PipeName">
  883.  
  884. A named pipe, created via C<CreateNamedPipe>.
  885.  
  886. =back
  887.  
  888. C<$uAccess> is an unsigned value with bits set indicating the
  889. type of access desired.  Usually either C<0> ["query" access],
  890. C<GENERIC_READ>, C<GENERIC_WRITE>, C<GENERIC_READ|GENERIC_WRITE>,
  891. or C<GENERIC_ALL>.  More specific types of access can be specified,
  892. such as C<FILE_APPEND_DATA> or C<FILE_READ_EA>.
  893.  
  894. C<$uShare> controls how the file is shared, that is, whether other
  895. processes can have read, write, and/or delete access to the file while
  896. we have it opened.  C<$uShare> is an unsigned value with zero or more
  897. of these bits set:  C<FILE_SHARE_READ>, C<FILE_SHARE_WRITE>, and
  898. C<FILE_SHARE_DELETE>.
  899.  
  900. If another process currently has read, write, and/or delete access to
  901. the file and you don't allow that level of sharing, then your call to
  902. C<CreateFile> will fail.  If you requested read, write, and/or delete
  903. access and another process already has the file open but doesn't allow
  904. that level of sharing, thenn your call to C<createFile> will fail.  Once
  905. you have the file open, if another process tries to open it with read,
  906. write, and/or delete access and you don't allow that level of sharing,
  907. then that process won't be allowed to open the file.
  908.  
  909. C<$pSecAttr> should either be C<[]> [for C<NULL>] or a
  910. C<SECURITY_ATTRIBUTES> data structure packed into a string.
  911. For example, if C<$pSecDesc> contains a C<SECURITY_DESCRIPTOR>
  912. structure packed into a string, perhaps via:
  913.  
  914.     RegGetKeySecurity( $key, 4, $pSecDesc, 1024 );
  915.  
  916. then you can set C<$pSecAttr> via:
  917.  
  918.     $pSecAttr= pack( "L P i", 12, $pSecDesc, $bInheritHandle );
  919.  
  920. C<$uCreate> is one of the following values:  C<OPEN_ALWAYS>,
  921. C<OPEN_EXISTING>, C<TRUNCATE_EXISTING>, C<CREATE_ALWAYS>, and
  922. C<CREATE_NEW>.
  923.  
  924. C<$uFlags> is an unsigned value with zero or more bits set indicating
  925. attributes to associate with the file [C<FILE_ATTRIBUTE_*> values] or
  926. special options [C<FILE_FLAG_*> values].
  927.  
  928. If opening the client side of a named pipe, then you can also set
  929. C<$uFlags> to include C<SECURITY_SQOS_PRESENT> along with one of the
  930. other C<SECURITY_*> constants to specify the security quality of
  931. service to be used.
  932.  
  933. C<$hModel> is C<0> [or C<[]>, both of which mean C<NULL>] or a Win32
  934. native handle opened  with C<GENERIC_READ> access to a model file from
  935. which file attributes and extended attributes are to be copied if a
  936. new file gets created.
  937.  
  938. Examples:
  939.  
  940.     $hFlop= CreateFile( "//./A:", GENERIC_READ(),
  941.       FILE_SHARE_READ(), [], OPEN_EXISTING(), 0, [] )
  942.       or  die "Can't prevent others from writing to floppy: $^E\n";
  943.     $hDisk= createFile( $sFilePath, FILE_READ_ATTRIBUTES(),
  944.       FILE_SHARE_READ()|FILE_SHARE_WRITE(), [], OPEN_EXISTING(), 0, [] )
  945.       or  die "Can't read attributes of $sFilePath: $^E\n";
  946.     $hTemp= createFile( "$ENV{Temp}/temp.$$", GENERIC_WRITE(), 0,
  947.       CREATE_NEW(), FILE_FLAG_DELETE_ON_CLOSE()|attrLetsToBits("hst"), [] )
  948.       or  die "Can't create temporary file, temp.$$: $^E\n";
  949.  
  950. =item DefineDosDevice
  951.  
  952. =item C<DefineDosDevice( $uFlags, $sDosDeviceName, $sTargetPath )>
  953.  
  954. C<$sDosDeviceName> is the name of a DOS device for which we'd like
  955. to add or delete a definition.
  956.  
  957. C<$uFlags> is an unsigned value with zero or more of the following
  958. bits set:
  959.  
  960. =over
  961.  
  962. =item C<DDD_RAW_TARGET_PATH>
  963.  
  964. Indicates that C<$sTargetPath> will be a raw Windows NT object name. 
  965. This usually means that C<$sTargetPath> starts with C<"\\Devices\\">. 
  966. Note that you cannot use C<"/"> in place of C<"\\"> in raw target path
  967. names.
  968.  
  969. =item C<DDD_REMOVE_DEFINITION>
  970.  
  971. Requests that a definition be deleted.  If C<$sTargetPath> is
  972. C<[]> [for C<NULL>], then the most recently added definition for
  973. C<$sDosDeviceName> is removed.  Otherwise the most recently added
  974. definition matching C<$sTargetPath> is removed.
  975.  
  976. If the last definition is removed, then the DOS device name is also
  977. deleted.
  978.  
  979. =item C<DDD_EXACT_MATCH_ON_REMOVE>
  980.  
  981. When deleting a definition, this bit causes each C<$sTargetPath> to
  982. be compared to the full-length definition when searching for the most
  983. recently added match.  If this bit is not set, then C<$sTargetPath>
  984. only needs to match a prefix of the definition.
  985.  
  986. =back
  987.  
  988. C<$sTargetPath> is the DOS device's specific definition that you wish
  989. to add or delete.  For C<DDD_RAW_TARGET_PATH>, these usually start
  990. with C<"\\Devices\\">.  If the C<DDD_RAW_TARGET_PATH> bit is not
  991. set, then C<$sTargetPath> is just an ordinary path to some file or
  992. directory, providing the functionality of the B<subst> command.
  993.  
  994. =item DeleteFile
  995.  
  996. =item C<DeleteFile( $sFileName )>
  997.  
  998. Deletes the named file.  Compared to Perl's C<unlink>, C<DeleteFile>
  999. has the advantage of not deleting read-only files.  For E<some>
  1000. versions of Perl, C<unlink> silently calls C<chmod> whether it needs
  1001. to or not before deleting the file so that files that you have
  1002. protected by marking them as read-only are not always protected from
  1003. Perl's C<unlink>.
  1004.  
  1005. =item DeviceIoControl
  1006.  
  1007. =item C<DeviceIoControl( $hDevice, $uIoControlCode, $pInBuf, $lInBuf, $opOutBuf, $lOutBuf, $olRetBytes, $pOverlapped )>
  1008.  
  1009. C<$hDevice> is a Win32 native file handle to a device [return value
  1010. from C<CreateFile>].
  1011.  
  1012. C<$uIoControlCode> is an unsigned value [a C<IOCTL_*> constant]
  1013. indicating the type query or other operation to be performed.
  1014.  
  1015. C<$pInBuf> is C<[]> [for C<NULL>] or a data structure packed into a string.
  1016. The type of data structure depends on the C<$uIoControlCode> value.
  1017. C<$lInBuf> is C<0> or the length of the structure in C<$pInBuf>.  If 
  1018. C<$pInBuf> is not C<[]> and C<$lInBuf> is C<0>, then C<$lInBuf> will
  1019. automatically be set to C<length($pInBuf)> for you.
  1020.  
  1021. C<$opOutBuf> is C<[]> [for C<NULL>] or will be set to contain a
  1022. returned data structure packed into a string.  C<$lOutBuf> indicates
  1023. how much space to allocate in C<$opOutBuf> for C<DeviceIoControl> to
  1024. store the data structure.  If C<$lOutBuf> is a number and C<$opOutBuf>
  1025. already has a buffer allocated for it that is larger than C<$lOutBuf>
  1026. bytes, then this larger buffer size will be passed to C<DeviceIoControl>.
  1027. To force a specific buffer size to be passed to C<DeviceIoControl>,
  1028. prepend a C<"="> to the front of C<$lOutBuf>.
  1029.  
  1030. C<$olRetBytes> is C<[]> or is a scalar to receive the number of bytes
  1031. written to C<$opOutBuf>.  Even when C<$olRetBytes> is C<[]>, a valid
  1032. pointer to a C<DWORD> [and not C<NULL>] is passed to C<DeviceIoControl>.
  1033. In this case, C<[]> just means that you don't care about the value
  1034. that might be written to C<$olRetBytes>, which is usually the case
  1035. since you can usually use C<length($opOutBuf)> instead.
  1036.  
  1037. C<$pOverlapped> is C<[]> or is a C<OVERLAPPED> structure packed into
  1038. a string.  This is only useful if C<$hDevice> was opened with the
  1039. C<FILE_FLAG_OVERLAPPED> flag set.
  1040.  
  1041. =item FdGetOsFHandle
  1042.  
  1043. =item C<$hNativeHandle= FdGetOsFHandle( $ivFd )>
  1044.  
  1045. C<FdGetOsFHandle> simply calls C<_get_osfhandle()>.  It was renamed
  1046. to better fit in with the rest the function names of this module,
  1047. in particular to distinguish it from C<GetOsFHandle>.  It takes an
  1048. integer file descriptor [as from C<fileno>] and return the Win32
  1049. native file handle assocatiated with that file descriptor.
  1050.  
  1051. When you call Perl's C<open> to set a Perl file handle [like C<STDOUT>],
  1052. Perl calls C's C<fopen> to set a stdio C<FILE *>.  C's C<fopen> calls
  1053. something like Unix's C<open>, that is, Win32's C<_sopen>, to get an
  1054. integer file descriptor [where 0 is for C<STDIN>, 1 for C<STDOUT>, etc.].
  1055. Win32's C<_sopen> calls C<CreateFile> to set a C<HANDLE>, a Win32 native
  1056. file handle.  So every Perl file handle [like C<STDOUT>] has an integer
  1057. file descriptor associated with it that you can get via C<fileno>.  And,
  1058. under Win32, every file descriptor has a Win32 native file handle
  1059. associated with it.  C<FdGetOsFHandle> lets you get access to that.
  1060.  
  1061. =item GetDriveType
  1062.  
  1063. =item C<$uDriveType= GetDriveType( $sRootPath )>
  1064.  
  1065. Takes a string giving the path to the root directory of a file system
  1066. [called a "drive" because every file system is assigned a "drive letter"]
  1067. and returns an unsigned value indicating the type of drive the file
  1068. system is on.  The return value should be one of:
  1069.  
  1070. =over
  1071.  
  1072. =item C<DRIVE_UNKNOWN>
  1073.  
  1074. None of the following.
  1075.  
  1076. =item C<DRIVE_NO_ROOT_DIR>
  1077.  
  1078. A "drive" that does not have a file system.  This can be a drive letter
  1079. that hasn't been defined or a drive letter assigned to a partition
  1080. that hasn't been formatted yet.
  1081.  
  1082. =item C<DRIVE_REMOVABLE>
  1083.  
  1084. A floppy diskette drive or other removable media drive, but not a CD-ROM
  1085. drive.
  1086.  
  1087. =item C<DRIVE_FIXED>
  1088.  
  1089. An ordinary hard disk partition.
  1090.  
  1091. =item C<DRIVE_REMOTE>
  1092.  
  1093. A network share.
  1094.  
  1095. =item C<DRIVE_CDROM>
  1096.  
  1097. A CD-ROM drive.
  1098.  
  1099. =item C<DRIVE_RAMDISK>
  1100.  
  1101. A "ram disk" or memory-resident virtual file system used for high-speed
  1102. access to small amounts of temporary file space.
  1103.  
  1104. =back
  1105.  
  1106. =item GetFileType
  1107.  
  1108. =item C<$uFileType= GetFileType( $hFile )>
  1109.  
  1110. Takes a Win32 native file handle and returns a C<FILE_TYPE_*> constant
  1111. indicating the type of the file opened on that handle:
  1112.  
  1113. =over
  1114.  
  1115. =item C<FILE_TYPE_UNKNOWN>
  1116.  
  1117. None of the below.  Often a special device.
  1118.  
  1119. =item C<FILE_TYPE_DISK>
  1120.  
  1121. An ordinary disk file.
  1122.  
  1123. =item C<FILE_TYPE_CHAR>
  1124.  
  1125. What Unix would call a "character special file", that is, a device that
  1126. works on characters streams such as a printer port or a console.
  1127.  
  1128. =item C<FILE_TYPE_PIPE>
  1129.  
  1130. Either a named or anonymous pipe.
  1131.  
  1132. =back
  1133.  
  1134. =item GetLogicalDrives
  1135.  
  1136. =item C<$uDriveBits= GetLogicalDrives()>
  1137.  
  1138. Returns an unsigned value with one bit set for each drive letter currently
  1139. defined.  If "A:" is currently a valid drive letter, then the C<1> bit
  1140. will be set in C<$uDriveBits>.  If "B:" is valid, then the C<2> bit will
  1141. be set.  If "Z:" is valid, then the C<2**26> [C<0x4000000>] bit will be
  1142. set.
  1143.  
  1144. =item GetLogicalDriveStrings
  1145.  
  1146. =item C<$olOutLength= GetLogicalDriveStrings( $lBufSize, $osBuffer )>
  1147.  
  1148. For each currently defined drive letter, a C<'\0'>-terminated string
  1149. of the path to the root of its file system is constructed.  All of
  1150. these strings are concatenated into single larger string and an extra
  1151. terminating C<'\0'> is added.  This larger string is returned in
  1152. C<$osBuffer>.  Note that this includes drive letters that have been
  1153. defined but that have not file system, such as drive letters assigned
  1154. to unformatted partitions.
  1155.  
  1156. C<$lBufSize> is the size of the buffer to allocate to store this
  1157. list of strings.  C<26*4+1> is always sufficient and should usually
  1158. be used.
  1159.  
  1160. C<$osBuffer> is a scalar to be set to contain the constructed string.
  1161.  
  1162. C<$olOutLength> is the number of bytes actually written to C<$osBuffer>
  1163. but C<length($osBuffer)> can also be used to determine this.
  1164.  
  1165. For example, on a poorly equipped computer,
  1166.  
  1167.     GetLogicalDriveStrings( 4*26+1, $osBuffer );
  1168.  
  1169. might set C<$osBuffer> to C<"A:\\\0C:\\\0\0"> [which is the same
  1170. as C<join "", 'A',':','\\','\0', 'C',':','\\','\0', '\0'>].
  1171.  
  1172. =item GetOsFHandle
  1173.  
  1174. =item C<$hNativeHandle= GetOsFHandle( FILE )>
  1175.  
  1176. Takes a Perl file handle [like C<STDIN>] and returns the Win32 native
  1177. file handle associated with it.  See C<FdGetOsFHandle> for more information.
  1178.  
  1179. =item GetVolumeInformation
  1180.  
  1181. =item C<GetVolumeInformation( $sRootPath, $osVolName, $lVolName, $ouSerialNum, $ouMaxNameLen, $ouFsFlags, $osFsType, $lFsType )>
  1182.  
  1183. Gets information about a file system volume.
  1184.  
  1185. C<$sRootPath> is a string specifying the path to the root of the file system,
  1186. for example, C<"C:/">.
  1187.  
  1188. C<$osVolName> is a scalar to be set to the string representing the
  1189. volume name, also called the file system label.  C<$lVolName> is the
  1190. number of bytes to allocate for the C<$osVolName> buffer [see
  1191. L<Buffer Sizes> for more information].
  1192.  
  1193. C<$ouSerialNum> is C<[]> [for C<NULL>] or will be set to the numeric
  1194. value of the volume's serial number.
  1195.  
  1196. C<$ouMaxNameLen> is C<[]> [for C<NULL>] or will be set to the maximum
  1197. length allowed for a file name or directory name within the file system.
  1198.  
  1199. C<$osFsType> is a scalar to be set to the string representing the
  1200. file system type, such as C<"FAT"> or C<"NTFS">.  C<$lFsType> is the
  1201. number of bytes to allocate for the C<$osFsType> buffer [see
  1202. L<Buffer Sizes> for more information].
  1203.  
  1204. C<$ouFsFlags> is C<[]> [for C<NULL>] or will be set to an unsigned integer
  1205. with bits set indicating properties of the file system:
  1206.  
  1207. =over
  1208.  
  1209. =item C<FS_CASE_IS_PRESERVED>
  1210.  
  1211. The file system preserves the case of file names [usually true].
  1212. That is, it doesn't change the case of file names such as forcing
  1213. them to upper- or lower-case.
  1214.  
  1215. =item C<FS_CASE_SENSITIVE>
  1216.  
  1217. The file system supports the ability to not ignore the case of file
  1218. names [but might ignore case the way you are using it].  That is, the
  1219. file system has the ability to force you to get the letter case of a
  1220. file's name exactly right to be able to open it.  This is true for
  1221. "NTFS" file systems, even though case in file names is usually still
  1222. ignored.
  1223.  
  1224. =item C<FS_UNICODE_STORED_ON_DISK>
  1225.  
  1226. The file system perserves Unicode in file names [true for "NTFS"].
  1227.  
  1228. =item C<FS_PERSISTENT_ACLS>
  1229.  
  1230. The file system supports setting Access Control Lists on files [true
  1231. for "NTFS"].
  1232.  
  1233. =item C<FS_FILE_COMPRESSION>
  1234.  
  1235. The file system supports compression on a per-file basis [true for
  1236. "NTFS"].
  1237.  
  1238. =item C<FS_VOL_IS_COMPRESSED>
  1239.  
  1240. The entire file system is compressed such as via "DoubleSpace".
  1241.  
  1242. =back
  1243.  
  1244. =item IsRecognizedPartition
  1245.  
  1246. =item C<IsRecognizedPartition( $ivPartitionType )>
  1247.  
  1248. Takes a partition type and returns whether that partition type is
  1249. supported under Win32.  C<$ivPartitonType> is an integer value as from
  1250. the operating system byte of a hard disk's DOS-compatible partition
  1251. table [that is, a partition table for x86-based Win32, not, for
  1252. example, one used with Windows NT for Alpha processors].  For example,
  1253. the C<PartitionType> member of the C<PARTITION_INFORMATION> structure.
  1254.  
  1255. Common values for C<$ivPartitionType> include C<PARTITION_FAT_12==1>,
  1256. C<PARTITION_FAT_16==4>, C<PARTITION_EXTENDED==5>, C<PARTITION_FAT32==0xB>.
  1257.  
  1258. =item IsContainerPartition
  1259.  
  1260. =item C<IsContainerPartition( $ivPartitionType )>
  1261.  
  1262. Takes a partition type and returns whether that partition is a
  1263. "container" partition that is supported under Win32, that is, whether
  1264. it is an "extended" partition that can contain "logical" partitions. 
  1265. C<$ivPartitonType> is as for C<IsRecognizedPartition>.
  1266.  
  1267. =item MoveFile
  1268.  
  1269. =item C<MoveFile( $sOldName, $sNewName )>
  1270.  
  1271. Renames a file or directory.  C<$sOldName> is the name of the existing
  1272. file or directory that is to be renamed.  C<$sNewName> is the new name
  1273. to give the file or directory.
  1274.  
  1275. Files can be "renamed" between file systems and the file contents and
  1276. some attributes will be moved.  Directories can only be renamed within
  1277. one file system.  If there is already a file or directory named
  1278. C<$sNewName>, then C<MoveFile> will fail.
  1279.  
  1280. =item MoveFileEx
  1281.  
  1282. =item C<MoveFileEx( $sOldName, $sNewName, $uFlags )>
  1283.  
  1284. Renames a file or directory.  C<$sOldName> is the name of the existing
  1285. file or directory that is to be renamed.  C<$sNewName> is the new name
  1286. to give the file or directory.
  1287.  
  1288. C<$uFlags> is an unsigned value with zero or more of the following bits set:
  1289.  
  1290. =over
  1291.  
  1292. =item C<MOVEFILE_REPLACE_EXISTING>
  1293.  
  1294. If this bit is set and a file or directory named C<$sNewName> already
  1295. exists, then it will be replaced by C<$sOldName>.  If this bit is not
  1296. set then C<MoveFileEx> will fail rather than replace an existing
  1297. C<$sNewName>.
  1298.  
  1299. =item C<MOVEFILE_COPY_ALLOWED>
  1300.  
  1301. Allows files [but not directories] to be moved between file systems
  1302. by copying the C<$sOldName> file data and some attributes to
  1303. C<$sNewName> and then deleting C<$sOldName>.  If this bit is not set
  1304. [or if C<$sOldName> denotes a directory] and C<$sNewName> refers to a
  1305. different file system than C<$sOldName>, then C<MoveFileEx> will fail.
  1306.  
  1307. =item C<MOVEFILE_DELAY_UNTIL_REBOOT>
  1308.  
  1309. Preliminary verifications are made and then an entry is added to the
  1310. Registry to cause the rename [or delete] operation to be done the
  1311. next time this copy of the operating system is booted [right after
  1312. any automatic file system checks have completed].  This is not
  1313. supported under Windows 95.
  1314.  
  1315. When this bit is set, C<$sNewName> can be C<[]> [for C<NULL>] to
  1316. indicate that C<$sOldName> should be deleted during the next boot
  1317. rather than renamed.
  1318.  
  1319. Setting both the C<MOVEFILE_COPY_ALLOWED> and
  1320. C<MOVEFILE_DELAY_UNTIL_REBOOT> bits will cause C<MoveFileEx> to fail.
  1321.  
  1322. =item C<MOVEFILE_WRITE_THROUGH>
  1323.  
  1324. Ensures that C<MoveFileEx> won't return until the operation has
  1325. finished and been flushed to disk.   This is not supported under
  1326. Windows 95.  Only affects file renames to another file system,
  1327. forcing a buffer flush at the end of the copy operation.
  1328.  
  1329. =back
  1330.  
  1331. =item OsFHandleOpen
  1332.  
  1333. =item C<OsFHandleOpen( FILE, $hNativeHandle, $sMode )>
  1334.  
  1335. Opens a Perl file handle based on an already open Win32 native
  1336. file handle [much like C's C<fdopen()> does with a file descriptor].
  1337.  
  1338. C<FILE> is a Perl file handle [in any of the supported forms, a
  1339. bareword, a string, a typeglob, or a reference to a typeglob] that
  1340. will be opened.  If C<FILE> is already open, it will automatically
  1341. be closed before it is reopened.
  1342.  
  1343. C<$hNativeHandle> is an open Win32 native file handle, probably the
  1344. return value from C<CreateFile>.
  1345.  
  1346. C<$sMode> is string of zero or more letters from C<"rwatb">.  These
  1347. are translated into a combination C<O_RDONLY> [C<"r">], C<O_WRONLY>
  1348. [C<"w">], C<O_RDWR> [C<"rw">], C<O_APPEND> [C<"a">], C<O_TEXT>
  1349. [C<"t">], and C<O_BINARY> [C<"b">] flags [see the L<Fcntl> module]
  1350. that is passed to C<OsFHandleOpenFd>.   Currently only C<O_APPEND>
  1351. and C<O_TEXT> have any significance.
  1352.  
  1353. Also, a C<"r"> and/or C<"w"> in C<$sMode> is used to decide how the
  1354. file descriptor is converted into a Perl file handle, even though this
  1355. doesn't appear to make a difference.  One of the following is used:
  1356.  
  1357.     open( FILE, "<&=".$ivFd )
  1358.     open( FILE, ">&=".$ivFd )
  1359.     open( FILE, "+<&=".$ivFd )
  1360.  
  1361. C<OsFHandleOpen> eventually calls the Win32-specific C routine
  1362. C<_open_osfhandle()> or Perl's "improved" version called
  1363. C<win32_open_osfhandle()>.  Prior to Perl5.005, C's
  1364. C<_open_osfhandle()> is called which will fail if
  1365. C<GetFileType($hNativeHandle)> would return C<FILE_TYPE_UNKNOWN>. 
  1366. For Perl5.005 and later, C<OsFHandleOpen> calls
  1367. C<win32_open_osfhandle()> from the Perl DLL which doesn't have
  1368. this restriction.
  1369.  
  1370. =item OsFHandleOpenFd
  1371.  
  1372. =item C<$ivFD= OsFHandleOpenFd( $hNativeHandle, $uMode )>
  1373.  
  1374. Opens a file descriptor [C<$ivFD>] based on an already open Win32
  1375. native file handle, C<$hNativeHandle>.  This just calls the
  1376. Win32-specific C routine C<_open_osfhandle()> or Perl's "improved"
  1377. version called C<win32_open_osfhandle()>.  Prior to Perl5.005, C's
  1378. C<_open_osfhandle()> is called which will fail if
  1379. C<GetFileType($hNativeHandle)> would return C<FILE_TYPE_UNKNOWN>.  
  1380. For Perl5.005 and later, C<OsFHandleOpenFd> calls
  1381. C<win32_open_osfhandle()> from the Perl DLL which doesn't have this
  1382. restriction.
  1383.  
  1384. C<$uMode> the logical combination of zero or more C<O_*> constants
  1385. exported by the C<Fcntl> module.  Currently only C<O_APPEND> and
  1386. C<O_TEXT> have any significance.
  1387.  
  1388. =item QueryDosDevice
  1389.  
  1390. =item C<$olTargetLen= QueryDosDevice( $sDosDeviceName, $osTargetPath, $lTargetBuf )>
  1391.  
  1392. Looks up the definition of a given "DOS" device name, yielding the
  1393. active Windows NT native device name along with any currently dormant
  1394. definitions.
  1395.  
  1396. C<$sDosDeviceName> is the name of the "DOS" device whose definitions
  1397. we want.  For example, C<"C:">, C<"COM1">, or C<"PhysicalDrive0">.
  1398. If C<$sDosDeviceName> is C<[]> [for C<NULL>], the list of all DOS
  1399. device names is returned instead.
  1400.  
  1401. C<$osTargetPath> will be assigned a string containing the list of
  1402. definitions.  The definitions are each C<'\0'>-terminate and are
  1403. concatenated into the string, most recent first, with an extra C<'\0'>
  1404. at the end of the whole string [see C<GetLogicalDriveStrings> for
  1405. a sample of this format].
  1406.  
  1407. C<$lTargetBuf> is the size [in bytes] of the buffer to allocate for
  1408. C<$osTargetPath>.  See L<Buffers Sizes> for more information.
  1409.  
  1410. C<$olTargetLen> is set to the number of bytes written to
  1411. C<$osTargetPath> but you can also use C<length($osTargetPath)>
  1412. to determine this.
  1413.  
  1414. For failure, C<0> is returned and C<$^E> is set to the reason for the
  1415. failure.
  1416.  
  1417. =item ReadFile
  1418.  
  1419. =item C<ReadFile( $hFile, $opBuffer, $lBytes, $olBytesRead, $pOverlapped )>
  1420.  
  1421. Reads bytes from a file or file-like device.
  1422.  
  1423. C<$hFile> is a Win32 native file handle open to the file or device to
  1424. read from.
  1425.  
  1426. C<$opBuffer> will be set to a string containing the bytes read.
  1427.  
  1428. C<$lBytes> is the number of bytes you would like to read. 
  1429. C<$opBuffer> is automatically initialized to have a buffer large
  1430. enough to hold that many bytes.  Unlike other buffer sizes, C<$lBytes>
  1431. does not need to have a C<"="> prepended to it to prevent a larger
  1432. value to be passed to the underlying Win32 C<ReadFile> API.  However,
  1433. a leading C<"="> will be silently ignored, even if Perl warnings are
  1434. enabled.
  1435.  
  1436. if C<$olBytesRead> is not C<[]>, it will be set to the actual number
  1437. of bytes read, though C<length($opBuffer)> can also be used to
  1438. determine this.
  1439.  
  1440. C<$pOverlapped> is C<[]> or is a C<OVERLAPPED> structure packed
  1441. into a string.  This is only useful if C<$hFile> was opened with
  1442. the C<FILE_FLAG_OVERLAPPED> flag set.
  1443.  
  1444. =item SetErrorMode
  1445.  
  1446. =item C<$uOldMode= SetErrorMode( $uNewMode )>
  1447.  
  1448. Sets the mode controlling system error handling E<and> returns the
  1449. previous mode value.  Both C<$uOldMode> and C<$uNewMode> will have
  1450. zero or more of the following bits set:
  1451.  
  1452. =over
  1453.  
  1454. =item C<SEM_FAILCRITICALERRORS>
  1455.  
  1456. If set, indicates that when a critical error is encountered, the call
  1457. that triggered the error fails immediately.  Normally this bit is not
  1458. set, which means that a critical error causes a dialogue box to appear
  1459. notifying the desktop user that some application has triggered a
  1460. critical error.   The dialogue box allows the desktop user to decide
  1461. whether the critical error is returned to the process, is ignored, or
  1462. the offending operation is retried.
  1463.  
  1464. This affects the C<CreateFile> and C<GetVolumeInformation> calls.
  1465.  
  1466. =item C<SEM_NOALIGNMENTFAULTEXCEPT>
  1467.  
  1468. If set, this causes memory access misalignment faults to be
  1469. automatically fixed in a manner invisible to the process.  This flag
  1470. is ignored on x86-based versions of Windows NT.  This flag is not
  1471. supported on Windows 95.
  1472.  
  1473. =item C<SEM_NOGPFAULTERRORBOX>
  1474.  
  1475. If set, general protection faults do not generate a dialogue box but
  1476. can instead be handled by the process via an exception handler.  This
  1477. bit should not be set by programs that don't know how to handle such
  1478. faults.
  1479.  
  1480. =item C<SEM_NOOPENFILEERRORBOX>
  1481.  
  1482. If set, then when an attempt to continue reading from or writing to
  1483. an already open file [usually on a removable medium like a floppy
  1484. diskette] finds the file no longer available, the call will
  1485. immediately fail.  Normally this bit is not set, which means that
  1486. instead a dialogue box will appear notifying the desktop user that
  1487. some application has run into this problem.   The dialogue box allows
  1488. the desktop user to decide whether the failure is returned to the
  1489. process, is ignored, or the offending operation is retried.
  1490.  
  1491. This affects the C<ReadFile> and C<WriteFile> calls.
  1492.  
  1493. =back
  1494.  
  1495. =item SetFilePointer
  1496.  
  1497. =item C<$uNewPos= SetFilePointer( $hFile, $ivOffset, $ioivOffsetHigh, $uFromWhere )>
  1498.  
  1499. The native Win32 version of C<seek()>.  C<SetFilePointer> sets the
  1500. position within a file where the next read or write operation will
  1501. start from.
  1502.  
  1503. C<$hFile> is a Win32 native file handle.
  1504.  
  1505. C<$uFromWhere> is either C<FILE_BEGIN>, C<FILE_CURRENT>, or
  1506. C<FILE_END>, indicating that the new file position is being specified
  1507. relative to the beginning of the file, the current file pointer, or
  1508. the end of the file, respectively.
  1509.  
  1510. C<$ivOffset> is [if C<$ioivOffsetHigh> is C<[]>] the offset [in bytes]
  1511. to the new file position from the position specified via
  1512. C<$uFromWhere>.  If C<$ioivOffsetHigh> is not C<[]>, then C<$ivOffset>
  1513. is treated is converted to an unsigned value to be used as the
  1514. low-order 4 bytes of the offset.
  1515.  
  1516. C<$ioivOffsetHigh> can be C<[]> [for C<NULL>] to indicate that you are
  1517. only specifying a 4-byte offset and the resulting file position will
  1518. be 0xFFFFFFFE or less [just under 4GB].  Otherwise C<$ioivOfffsetHigh>
  1519. starts out with the high-order 4 bytes [signed] of the offset and gets
  1520. set to the [unsigned] high-order 4 bytes of the resulting file position.
  1521.  
  1522. The underlying C<SetFilePointer> returns C<0xFFFFFFFF> to indicate
  1523. failure, but if C<$ioivOffsetHigh> is not C<[]>, you would also have
  1524. to check C<$^E> to determine whether C<0xFFFFFFFF> indicates an error
  1525. or not.  C<Win32API::File::SetFilePointer> does this checking for you
  1526. and returns a false value if and only if the underlying
  1527. C<SetFilePointer> failed.  For this reason, C<$uNewPos> is set to C<"0
  1528. but true"> if you set the file pointer to the beginning of the file
  1529. [or any position with 0 for the low-order 4 bytes].
  1530.  
  1531. =item WriteFile
  1532.  
  1533. =item C<WriteFile( $hFile, $pBuffer, $lBytes, $ouBytesWritten, $pOverlapped )>
  1534.  
  1535. Write bytes to a file or file-like device.
  1536.  
  1537. C<$hFile> is a Win32 native file handle open to the file or device to
  1538. write to.
  1539.  
  1540. C<$pBuffer> is a string containing the bytes to be written.
  1541.  
  1542. C<$lBytes> is the number of bytes you would like to write.  If
  1543. C<$pBuffer> is not at least C<$lBytes> long, C<WriteFile> croaks.  You
  1544. can specify C<0> for C<$lBytes> to write C<length($pBuffer)> bytes.
  1545. A leading C<"="> on C<$lBytes> will be silently ignored, even if Perl
  1546. warnings are enabled.
  1547.  
  1548. C<$ouBytesWritten> will be set to the actual number of bytes written
  1549. unless you specify it as C<[]>.
  1550.  
  1551. C<$pOverlapped> is C<[]> or is a C<OVERLAPPED> structure packed
  1552. into a string.  This is only useful if C<$hFile> was opened with
  1553. the C<FILE_FLAG_OVERLAPPED> flag set.
  1554.  
  1555. =back
  1556.  
  1557. =item C<":FuncA">
  1558.  
  1559. The ASCII-specific functions.  Each of these is just the same as the
  1560. version without the trailing "A".
  1561.  
  1562.     CopyFileA
  1563.     CreateFileA
  1564.     DefineDosDeviceA
  1565.     DeleteFileA
  1566.     GetDriveTypeA
  1567.     GetLogicalDriveStringsA
  1568.     GetVolumeInformationA
  1569.     MoveFileA
  1570.     MoveFileExA
  1571.     QueryDosDeviceA
  1572.  
  1573. =item C<":FuncW">
  1574.  
  1575. The wide-character-specific (Unicode) functions.  Each of these is
  1576. just the same as the version without the trailing "W" except that
  1577. strings are expected in Unicode and some lengths are measured as
  1578. number of C<WCHAR>s instead of number of bytes, as indicated below.
  1579.  
  1580. =over
  1581.  
  1582. =item CopyFileW
  1583.  
  1584. =item C<CopyFileW( $swOldFileName, $swNewFileName, $bFailIfExists )>
  1585.  
  1586. C<$swOldFileName> and C<$swNewFileName> are Unicode strings.
  1587.  
  1588. =item CreateFileW
  1589.  
  1590. =item C<$hObject= CreateFileW( $swPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )>
  1591.  
  1592. C<$swPath> is Unicode.
  1593.  
  1594. =item DefineDosDeviceW
  1595.  
  1596. =item C<DefineDosDeviceW( $uFlags, $swDosDeviceName, $swTargetPath )>
  1597.  
  1598. C<$swDosDeviceName> and C<$swTargetPath> are Unicode.
  1599.  
  1600. =item DeleteFileW
  1601.  
  1602. =item C<DeleteFileW( $swFileName )>
  1603.  
  1604. C<$swFileName> is Unicode.
  1605.  
  1606. =item GetDriveTypeW
  1607.  
  1608. =item C<$uDriveType= GetDriveTypeW( $swRootPath )>
  1609.  
  1610. C<$swRootPath> is Unicode.
  1611.  
  1612. =item GetLogicalDriveStringsW
  1613.  
  1614. =item C<$olwOutLength= GetLogicalDriveStringsW( $lwBufSize, $oswBuffer )>
  1615.  
  1616. Unicode is stored in C<$oswBuffer>.  C<$lwBufSize> and C<$olwOutLength>
  1617. are measured as number of C<WCHAR>s.
  1618.  
  1619. =item GetVolumeInformationW
  1620.  
  1621. =item C<GetVolumeInformationW( $swRootPath, $oswVolName, $lwVolName, $ouSerialNum, $ouMaxNameLen, $ouFsFlags, $oswFsType, $lwFsType )>
  1622.  
  1623. C<$swRootPath> is Unicode and Unicode is written to C<$oswVolName> and
  1624. C<$oswFsType>.  C<$lwVolName> and C<$lwFsType> are measures as number
  1625. of C<WCHAR>s.
  1626.  
  1627. =item MoveFileW
  1628.  
  1629. =item C<MoveFileW( $swOldName, $swNewName )>
  1630.  
  1631. C<$swOldName> and C<$swNewName> are Unicode.
  1632.  
  1633. =item MoveFileExW
  1634.  
  1635. =item C<MoveFileExW( $swOldName, $swNewName, $uFlags )>
  1636.  
  1637. C<$swOldName> and C<$swNewName> are Unicode.
  1638.  
  1639. =item QueryDosDeviceW
  1640.  
  1641. =item C<$olwTargetLen= QueryDosDeviceW( $swDeviceName, $oswTargetPath, $lwTargetBuf )>
  1642.  
  1643. C<$swDeviceName> is Unicode and Unicode is written to
  1644. C<$oswTargetPath>.  C<$lwTargetBuf> and C<$olwTargetLen> are measured
  1645. as number of  C<WCHAR>s.
  1646.  
  1647. =back
  1648.  
  1649. =item C<":Misc">
  1650.  
  1651. Miscellaneous constants.  Used for the C<$uCreate> argument of
  1652. C<CreateFile> or the C<$uFromWhere> argument of C<SetFilePointer>.
  1653. Plus C<INVALID_HANDLE_VALUE>, which you usually won't need to check
  1654. for since C<CreateFile> translates it into a false value.
  1655.  
  1656.     CREATE_ALWAYS        CREATE_NEW        OPEN_ALWAYS
  1657.     OPEN_EXISTING        TRUNCATE_EXISTING    INVALID_HANDLE_VALUE
  1658.     FILE_BEGIN        FILE_CURRENT        FILE_END
  1659.  
  1660. =item C<":DDD_">
  1661.  
  1662. Constants for the C<$uFlags> argument of C<DefineDosDevice>.
  1663.  
  1664.     DDD_EXACT_MATCH_ON_REMOVE
  1665.     DDD_RAW_TARGET_PATH
  1666.     DDD_REMOVE_DEFINITION
  1667.  
  1668. =item C<":DRIVE_">
  1669.  
  1670. Constants returned by C<GetDriveType>.
  1671.  
  1672.     DRIVE_UNKNOWN        DRIVE_NO_ROOT_DIR    DRIVE_REMOVABLE
  1673.     DRIVE_FIXED        DRIVE_REMOTE        DRIVE_CDROM
  1674.     DRIVE_RAMDISK
  1675.  
  1676. =item C<":FILE_">
  1677.  
  1678. Specific types of access to files that can be requested via the
  1679. C<$uAccess> argument to C<CreateFile>.
  1680.  
  1681.     FILE_READ_DATA            FILE_LIST_DIRECTORY
  1682.     FILE_WRITE_DATA            FILE_ADD_FILE
  1683.     FILE_APPEND_DATA        FILE_ADD_SUBDIRECTORY
  1684.     FILE_CREATE_PIPE_INSTANCE    FILE_READ_EA
  1685.     FILE_WRITE_EA            FILE_EXECUTE
  1686.     FILE_TRAVERSE            FILE_DELETE_CHILD
  1687.     FILE_READ_ATTRIBUTES        FILE_WRITE_ATTRIBUTES
  1688.     FILE_ALL_ACCESS            FILE_GENERIC_READ
  1689.     FILE_GENERIC_WRITE        FILE_GENERIC_EXECUTE )],
  1690.  
  1691. =item C<":FILE_ATTRIBUTE_">
  1692.  
  1693. File attribute constants.  Returned by C<attrLetsToBits> and used in
  1694. the C<$uFlags> argument to C<CreateFile>.
  1695.  
  1696.     FILE_ATTRIBUTE_ARCHIVE        FILE_ATTRIBUTE_COMPRESSED
  1697.     FILE_ATTRIBUTE_HIDDEN        FILE_ATTRIBUTE_NORMAL
  1698.     FILE_ATTRIBUTE_OFFLINE        FILE_ATTRIBUTE_READONLY
  1699.     FILE_ATTRIBUTE_SYSTEM        FILE_ATTRIBUTE_TEMPORARY
  1700.  
  1701. =item C<":FILE_FLAG_">
  1702.  
  1703. File option flag constants.  Used in the C<$uFlags> argument to
  1704. C<CreateFile>.
  1705.  
  1706.     FILE_FLAG_BACKUP_SEMANTICS    FILE_FLAG_DELETE_ON_CLOSE
  1707.     FILE_FLAG_NO_BUFFERING        FILE_FLAG_OVERLAPPED
  1708.     FILE_FLAG_POSIX_SEMANTICS    FILE_FLAG_RANDOM_ACCESS
  1709.     FILE_FLAG_SEQUENTIAL_SCAN    FILE_FLAG_WRITE_THROUGH
  1710.  
  1711. =item C<":FILE_SHARE_">
  1712.  
  1713. File sharing constants.  Used in the C<$uShare> argument to
  1714. C<CreateFile>.
  1715.  
  1716.     FILE_SHARE_DELETE    FILE_SHARE_READ        FILE_SHARE_WRITE
  1717.  
  1718. =item C<":FILE_TYPE_">
  1719.  
  1720. File type constants.  Returned by C<GetFileType>.
  1721.  
  1722.     FILE_TYPE_CHAR        FILE_TYPE_DISK
  1723.     FILE_TYPE_PIPE        FILE_TYPE_UNKNOWN
  1724.  
  1725. =item C<":FS_">
  1726.  
  1727. File system characteristics constants.  Placed in the C<$ouFsFlags>
  1728. argument to C<GetVolumeInformation>.
  1729.  
  1730.     FS_CASE_IS_PRESERVED        FS_CASE_SENSITIVE
  1731.     FS_UNICODE_STORED_ON_DISK    FS_PERSISTENT_ACLS 
  1732.     FS_FILE_COMPRESSION        FS_VOL_IS_COMPRESSED
  1733.  
  1734. =item C<":IOCTL_STORAGE_">
  1735.  
  1736. I/O control operations for generic storage devices.  Used in the
  1737. C<$uIoControlCode> argument to C<DeviceIoControl>.  Includes
  1738. C<IOCTL_STORAGE_CHECK_VERIFY>, C<IOCTL_STORAGE_MEDIA_REMOVAL>,
  1739. C<IOCTL_STORAGE_EJECT_MEDIA>, C<IOCTL_STORAGE_LOAD_MEDIA>,
  1740. C<IOCTL_STORAGE_RESERVE>, C<IOCTL_STORAGE_RELEASE>,
  1741. C<IOCTL_STORAGE_FIND_NEW_DEVICES>, and
  1742. C<IOCTL_STORAGE_GET_MEDIA_TYPES>.
  1743.  
  1744. =over
  1745.  
  1746. =item C<IOCTL_STORAGE_CHECK_VERIFY>
  1747.  
  1748. Verify that a device's media is accessible.  C<$pInBuf> and C<$opOutBuf>
  1749. should both be C<[]>.  If C<DeviceIoControl> returns a true value, then
  1750. the media is currently accessible.
  1751.  
  1752. =item C<IOCTL_STORAGE_MEDIA_REMOVAL>
  1753.  
  1754. Allows the device's media to be locked or unlocked.  C<$opOutBuf> should
  1755. be C<[]>.  C<$pInBuf> should be a C<PREVENT_MEDIA_REMOVAL> data structure,
  1756. which is simply an interger containing a boolean value:
  1757.  
  1758.     $pInBuf= pack( "i", $bPreventMediaRemoval );
  1759.  
  1760. =item C<IOCTL_STORAGE_EJECT_MEDIA>
  1761.  
  1762. Requests that the device eject the media.  C<$pInBuf> and C<$opOutBuf>
  1763. should both be C<[]>.  
  1764.  
  1765. =item C<IOCTL_STORAGE_LOAD_MEDIA>
  1766.  
  1767. Requests that the device load the media.  C<$pInBuf> and C<$opOutBuf>
  1768. should both be C<[]>.
  1769.  
  1770. =item C<IOCTL_STORAGE_RESERVE>
  1771.  
  1772. Requests that the device be reserved.  C<$pInBuf> and C<$opOutBuf>
  1773. should both be C<[]>.
  1774.  
  1775. =item C<IOCTL_STORAGE_RELEASE>
  1776.  
  1777. Releases a previous device reservation.  C<$pInBuf> and C<$opOutBuf>
  1778. should both be C<[]>.
  1779.  
  1780. =item C<IOCTL_STORAGE_FIND_NEW_DEVICES>
  1781.  
  1782. No documentation on this IOCTL operation was found.
  1783.  
  1784. =item C<IOCTL_STORAGE_GET_MEDIA_TYPES>
  1785.  
  1786. Requests information about the type of media supported by the device. 
  1787. C<$pInBuf> should be C<[]>.  C<$opOutBuf> will be set to contain a
  1788. vector of C<DISK_GEOMETRY> data structures, which can be decoded via:
  1789.  
  1790.     # Calculate the number of DISK_GEOMETRY structures returned:
  1791.     my $cStructs= length($opOutBuf)/(4+4+4+4+4+4);
  1792.     my @fields= unpack( "L l I L L L" x $cStructs, $opOutBuf )
  1793.     my( @ucCylsLow, @ivcCylsHigh, @uMediaType, @uTracksPerCyl,
  1794.       @uSectsPerTrack, @uBytesPerSect )= ();
  1795.     while(  @fields  ) {
  1796.     push( @ucCylsLow, unshift @fields );
  1797.     push( @ivcCylsHigh, unshift @fields );
  1798.     push( @uMediaType, unshift @fields );
  1799.     push( @uTracksPerCyl, unshift @fields );
  1800.     push( @uSectsPerTrack, unshift @fields );
  1801.     push( @uBytesPerSect, unshift @fields );
  1802.     }
  1803.  
  1804. For the C<$i>th type of supported media, the following variables will
  1805. contain the following data.
  1806.  
  1807. =over
  1808.  
  1809. =item C<$ucCylsLow[$i]>
  1810.  
  1811. The low-order 4 bytes of the total number of cylinders.
  1812.  
  1813. =item C<$ivcCylsHigh[$i]> 
  1814.  
  1815. The high-order 4 bytes of the total number of cylinders.
  1816.  
  1817. =item C<$uMediaType[$i]>
  1818.  
  1819. A code for the type of media.  See the C<":MEDIA_TYPE"> export class.
  1820.  
  1821. =item C<$uTracksPerCyl[$i]>
  1822.  
  1823. The number of tracks in each cylinder.
  1824.  
  1825. =item C<$uSectsPerTrack[$i]>
  1826.  
  1827. The number of sectors in each track.
  1828.  
  1829. =item C<$uBytesPerSect[$i]>
  1830.  
  1831. The number of bytes in each sector.
  1832.  
  1833. =back
  1834.  
  1835. =back
  1836.  
  1837. =item C<":IOCTL_DISK_">
  1838.  
  1839. I/O control operations for disk devices.  Used in the
  1840. C<$uIoControlCode> argument to C<DeviceIoControl>.  Most of these
  1841. are to be used on physical drive devices like C<"//./PhysicalDrive0">.
  1842. However, C<IOCTL_DISK_GET_PARTITION_INFO> and
  1843. C<IOCTL_DISK_SET_PARTITION_INFO> should only be used on a
  1844. single-partition device like C<"//./C:">.
  1845.  
  1846. Includes C<IOCTL_DISK_GET_DRIVE_GEOMETRY>,
  1847. C<IOCTL_DISK_GET_PARTITION_INFO>, C<IOCTL_DISK_SET_PARTITION_INFO>,
  1848. C<IOCTL_DISK_GET_DRIVE_LAYOUT>, C<IOCTL_DISK_SET_DRIVE_LAYOUT>,
  1849. C<IOCTL_DISK_VERIFY>, C<IOCTL_DISK_FORMAT_TRACKS>,
  1850. C<IOCTL_DISK_REASSIGN_BLOCKS>, C<IOCTL_DISK_PERFORMANCE>,
  1851. C<IOCTL_DISK_IS_WRITABLE>, C<IOCTL_DISK_LOGGING>,
  1852. C<IOCTL_DISK_FORMAT_TRACKS_EX>, C<IOCTL_DISK_HISTOGRAM_STRUCTURE>,
  1853. C<IOCTL_DISK_HISTOGRAM_DATA>, C<IOCTL_DISK_HISTOGRAM_RESET>,
  1854. C<IOCTL_DISK_REQUEST_STRUCTURE>, and C<IOCTL_DISK_REQUEST_DATA>.
  1855.  
  1856. =over
  1857.  
  1858. =item C<IOCTL_DISK_GET_DRIVE_GEOMETRY>
  1859.  
  1860. Request information about the size and geometry of the disk.  C<$pInBuf>
  1861. should be C<[]>.  C<$opOutBuf> will be set to a C<DISK_GEOMETRY> data
  1862. structure which can be decode via:
  1863.  
  1864.     ( $ucCylsLow, $ivcCylsHigh, $uMediaType, $uTracksPerCyl,
  1865.       $uSectsPerTrack, $uBytesPerSect )= unpack( "L l I L L L", $opOutBuf );
  1866.  
  1867. =over
  1868.  
  1869. =item C<$ucCylsLow>
  1870.  
  1871. The low-order 4 bytes of the total number of cylinders.
  1872.  
  1873. =item C<$ivcCylsHigh> 
  1874.  
  1875. The high-order 4 bytes of the total number of cylinders.
  1876.  
  1877. =item C<$uMediaType>
  1878.  
  1879. A code for the type of media.  See the C<":MEDIA_TYPE"> export class.
  1880.  
  1881. =item C<$uTracksPerCyl>
  1882.  
  1883. The number of tracks in each cylinder.
  1884.  
  1885. =item C<$uSectsPerTrack>
  1886.  
  1887. The number of sectors in each track.
  1888.  
  1889. =item C<$uBytesPerSect>
  1890.  
  1891. The number of bytes in each sector.
  1892.  
  1893. =back
  1894.  
  1895. =item C<IOCTL_DISK_GET_PARTITION_INFO>
  1896.  
  1897. Request information about the size and geometry of the partition. 
  1898. C<$pInBuf> should be C<[]>.  C<$opOutBuf> will be set to a
  1899. C<PARTITION_INFORMATION> data structure which can be decode via:
  1900.  
  1901.     ( $uStartLow, $ivStartHigh, $ucHiddenSects, $uPartitionSeqNumber,
  1902.       $uPartitionType, $bActive, $bRecognized, $bToRewrite )=
  1903.       unpack( "L l L L C c c c", $opOutBuf );
  1904.  
  1905. =over
  1906.  
  1907. =item C<$uStartLow> and C<$ivStartHigh>
  1908.  
  1909. The low-order and high-order [respectively] 4 bytes of the starting
  1910. offset of the partition, measured in bytes.
  1911.  
  1912. =item C<$ucHiddenSects>
  1913.  
  1914. The number of "hidden" sectors for this partition.  Actually this is
  1915. the number of sectors found prior to this partiton, that is, the
  1916. starting offset [as found in C<$uStartLow> and C<$ivStartHigh>]
  1917. divided by the number of bytes per sector.
  1918.  
  1919. =item C<$uPartitionSeqNumber>
  1920.  
  1921. The sequence number of this partition.  Partitions are numbered
  1922. starting as C<1> [with "partition 0" meaning the entire disk].  
  1923. Sometimes this field may be C<0> and you'll have to infer the
  1924. partition sequence number from how many partitions preceed it on
  1925. the disk.
  1926.  
  1927. =item C<$uPartitionType>
  1928.  
  1929. The type of partition.  See the C<":PARTITION_"> export class for a
  1930. list of known types.  See also C<IsRecognizedPartition> and
  1931. C<IsContainerPartition>.
  1932.  
  1933. =item C<$bActive>
  1934.  
  1935. C<1> for the active [boot] partition, C<0> otherwise.
  1936.  
  1937. =item C<$bRecognized>
  1938.  
  1939. Whether this type of partition is support under Win32.
  1940.  
  1941. =item C<$bToRewrite>
  1942.  
  1943. Whether to update this partition information.  This field is not used
  1944. by C<IOCTL_DISK_GET_PARTITION_INFO>.  For
  1945. C<IOCTL_DISK_SET_DRIVE_LAYOUT>, you must set this field to a true
  1946. value for any partitions you wish to have changed, added, or deleted.
  1947.  
  1948. =back
  1949.  
  1950. =item C<IOCTL_DISK_SET_PARTITION_INFO>
  1951.  
  1952. Change the type of the partition.  C<$opOutBuf> should be C<[]>.
  1953. C<$pInBuf> should be a C<SET_PARTITION_INFORMATION> data structure
  1954. which is just a single byte containing the new parition type [see
  1955. the C<":PARTITION_"> export class for a list of known types]:
  1956.  
  1957.     $pInBuf= pack( "C", $uPartitionType );
  1958.  
  1959. =item C<IOCTL_DISK_GET_DRIVE_LAYOUT>
  1960.  
  1961. Request information about the disk layout.  C<$pInBuf> should be C<[]>.
  1962. C<$opOutBuf> will be set to contain C<DRIVE_LAYOUT_INFORMATION>
  1963. structure including several C<PARTITION_INFORMATION> structures:
  1964.  
  1965.     my( $cPartitions, $uDiskSignature )= unpack( "L L", $opOutBuf );
  1966.     my @fields= unpack( "x8" . ( "L l L L C c c c" x $cPartitions ),
  1967.                 $opOutBuf );
  1968.     my( @uStartLow, @ivStartHigh, @ucHiddenSects,
  1969.       @uPartitionSeqNumber, @uPartitionType, @bActive,
  1970.       @bRecognized, @bToRewrite )= ();
  1971.     for(  1..$cPartition  ) {
  1972.     push( @uStartLow, unshift @fields );
  1973.     push( @ivStartHigh, unshift @fields );
  1974.     push( @ucHiddenSects, unshift @fields );
  1975.     push( @uPartitionSeqNumber, unshift @fields );
  1976.     push( @uPartitionType, unshift @fields );
  1977.     push( @bActive, unshift @fields );
  1978.     push( @bRecognized, unshift @fields );
  1979.     push( @bToRewrite, unshift @fields );
  1980.     }
  1981.  
  1982. =over
  1983.  
  1984. =item C<$cPartitions>
  1985.  
  1986. If the number of partitions on the disk.
  1987.  
  1988. =item C<$uDiskSignature>
  1989.  
  1990. Is the disk signature, a unique number assigned by Disk Administrator
  1991. [F<WinDisk.exe>] and used to identify the disk.  This allows drive
  1992. letters for partitions on that disk to remain constant even if the
  1993. SCSI Target ID of the disk gets changed.
  1994.  
  1995. =back
  1996.  
  1997. See C<IOCTL_DISK_GET_PARTITION_INFORMATION> for information on the
  1998. remaining these fields.
  1999.  
  2000. =item C<IOCTL_DISK_SET_DRIVE_LAYOUT>
  2001.  
  2002. Change the partition layout of the disk.  C<$pOutBuf> should be C<[]>.
  2003. C<$pInBuf> should be a C<DISK_LAYOUT_INFORMATION> data structure
  2004. including several C<PARTITION_INFORMATION> data structures.
  2005.  
  2006.     # Already set:  $cPartitions, $uDiskSignature, @uStartLow, @ivStartHigh,
  2007.     #   @ucHiddenSects, @uPartitionSeqNumber, @uPartitionType, @bActive,
  2008.     #   @bRecognized, and @bToRewrite.
  2009.     my( @fields, $prtn )= ();
  2010.     for $prtn (  1..$cPartition  ) {
  2011.     push( @fields, $uStartLow[$prtn-1], $ivStartHigh[$prtn-1],
  2012.         $ucHiddenSects[$prtn-1], $uPartitionSeqNumber[$prtn-1],
  2013.         $uPartitionType[$prtn-1], $bActive[$prtn-1],
  2014.         $bRecognized[$prtn-1], $bToRewrite[$prtn-1] );
  2015.     }
  2016.     $pInBuf= pack( "L L" . ( "L l L L C c c c" x $cPartitions ),
  2017.            $cPartitions, $uDiskSignature, @fields );
  2018.  
  2019. To delete a partition, zero out all fields except for C<$bToRewrite>
  2020. which should be set to C<1>.  To add a partition, increment
  2021. C<$cPartitions> and add the information for the new partition
  2022. into the arrays, making sure that you insert C<1> into @bToRewrite.
  2023.  
  2024. See C<IOCTL_DISK_GET_DRIVE_LAYOUT> and
  2025. C<IOCTL_DISK_GET_PARITITON_INFORMATION> for descriptions of the
  2026. fields.
  2027.  
  2028. =item C<IOCTL_DISK_VERIFY>
  2029.  
  2030. Performs a logical format of [part of] the disk.  C<$opOutBuf> should
  2031. be C<[]>.  C<$pInBuf> should contain a C<VERIFY_INFORMATION> data
  2032. structure:
  2033.  
  2034.     $pInBuf= pack( "L l L",
  2035.            $uStartOffsetLow, $ivStartOffsetHigh, $uLength );
  2036.  
  2037. =over
  2038.  
  2039. =item C<$uStartOffsetLow> and C<$ivStartOffsetHigh>
  2040.  
  2041. The low-order and high-order [respectively] 4 bytes of the offset [in
  2042. bytes] where the formatting should begin.
  2043.  
  2044. =item C<$uLength>
  2045.         
  2046. The length [in bytes] of the section to be formatted.
  2047.  
  2048. =back
  2049.  
  2050. =item C<IOCTL_DISK_FORMAT_TRACKS>
  2051.  
  2052. Format a range of tracks on the disk.  C<$opOutBuf> should be C<[]>. 
  2053. C<$pInBuf> should contain a C<FORMAT_PARAMETERS> data structure:
  2054.  
  2055.     $pInBuf= pack( "L L L L L", $uMediaType,
  2056.            $uStartCyl, $uEndCyl, $uStartHead, $uEndHead );
  2057.  
  2058. C<$uMediaType> if the type of media to be formatted.  Mostly used to
  2059. specify the density to use when formatting a floppy diskette.  See the
  2060. C<":MEDIA_TYPE"> export class for more information.
  2061.  
  2062. The remaining fields specify the starting and ending cylinder and
  2063. head of the range of tracks to be formatted.
  2064.  
  2065. =item C<IOCTL_DISK_REASSIGN_BLOCKS>
  2066.  
  2067. Reassign a list of disk blocks to the disk's spare-block pool. 
  2068. C<$opOutBuf> should be C<[]>.  C<$pInBuf> should be a
  2069. C<REASSIGN_BLOCKS> data structure:
  2070.  
  2071.     $pInBuf= pack( "S S L*", 0, $cBlocks, @uBlockNumbers );
  2072.  
  2073. =item C<IOCTL_DISK_PERFORMANCE>
  2074.  
  2075. Request information about disk performance.  C<$pInBuf> should be C<[]>.
  2076. C<$opOutBuf> will be set to contain a C<DISK_PERFORMANCE> data structure:
  2077.  
  2078.     my( $ucBytesReadLow, $ivcBytesReadHigh,
  2079.     $ucBytesWrittenLow, $ivcBytesWrittenHigh,
  2080.     $uReadTimeLow, $ivReadTimeHigh,
  2081.     $uWriteTimeLow, $ivWriteTimeHigh,
  2082.     $ucReads, $ucWrites, $uQueueDepth )=
  2083.     unpack( "L l L l L l L l L L L", $opOutBuf );
  2084.  
  2085. =item C<IOCTL_DISK_IS_WRITABLE>
  2086.  
  2087. No documentation on this IOCTL operation was found.
  2088.  
  2089. =item C<IOCTL_DISK_LOGGING>
  2090.  
  2091. Control disk logging.  Little documentation for this IOCTL operation
  2092. was found.  It makes use of a C<DISK_LOGGING> data structure:
  2093.  
  2094. =over
  2095.  
  2096. =item DISK_LOGGING_START
  2097.  
  2098. Start logging each disk request in a buffer internal to the disk device
  2099. driver of size C<$uLogBufferSize>:
  2100.  
  2101.     $pInBuf= pack( "C L L", 0, 0, $uLogBufferSize );
  2102.  
  2103. =item DISK_LOGGING_STOP
  2104.  
  2105. Stop loggin each disk request:
  2106.  
  2107.     $pInBuf= pack( "C L L", 1, 0, 0 );
  2108.  
  2109. =item DISK_LOGGING_DUMP
  2110.  
  2111. Copy the interal log into the supplied buffer:
  2112.  
  2113.     $pLogBuffer= ' ' x $uLogBufferSize
  2114.     $pInBuf= pack( "C P L", 2, $pLogBuffer, $uLogBufferSize );
  2115.  
  2116.     ( $uByteOffsetLow[$i], $ivByteOffsetHigh[$i],
  2117.       $uStartTimeLow[$i], $ivStartTimeHigh[$i],
  2118.       $uEndTimeLog[$i], $ivEndTimeHigh[$i],
  2119.       $hVirtualAddress[$i], $ucBytes[$i],
  2120.       $uDeviceNumber[$i], $bWasReading[$i] )=
  2121.       unpack( "x".(8+8+8+4+4+1+1+2)." L l L l L l L L C c x2", $pLogBuffer );
  2122.  
  2123. =item DISK_LOGGING_BINNING
  2124.  
  2125. Keep statics grouped into bins based on request sizes.
  2126.  
  2127.     $pInBuf= pack( "C P L", 3, $pUnknown, $uUnknownSize );
  2128.  
  2129. =back
  2130.  
  2131. =item C<IOCTL_DISK_FORMAT_TRACKS_EX>
  2132.  
  2133. No documentation on this IOCTL is included.
  2134.  
  2135. =item C<IOCTL_DISK_HISTOGRAM_STRUCTURE>
  2136.  
  2137. No documentation on this IOCTL is included.
  2138.  
  2139. =item C<IOCTL_DISK_HISTOGRAM_DATA>
  2140.  
  2141. No documentation on this IOCTL is included.
  2142.  
  2143. =item C<IOCTL_DISK_HISTOGRAM_RESET>
  2144.  
  2145. No documentation on this IOCTL is included.
  2146.  
  2147. =item C<IOCTL_DISK_REQUEST_STRUCTURE>
  2148.  
  2149. No documentation on this IOCTL operation was found.
  2150.  
  2151. =item C<IOCTL_DISK_REQUEST_DATA>
  2152.  
  2153. No documentation on this IOCTL operation was found.
  2154.  
  2155. =back
  2156.  
  2157. =item C<":GENERIC_">
  2158.  
  2159. Constants specifying generic access permissions that are not specific
  2160. to one type of object.
  2161.  
  2162.     GENERIC_ALL            GENERIC_EXECUTE
  2163.     GENERIC_READ            GENERIC_WRITE
  2164.  
  2165. =item C<":MEDIA_TYPE">
  2166.  
  2167. Different classes of media that a device can support.  Used in the
  2168. C<$uMediaType> field of a C<DISK_GEOMETRY> structure.
  2169.  
  2170. =over
  2171.  
  2172. =item C<Unknown>
  2173.  
  2174. Format is unknown.
  2175.  
  2176. =item C<F5_1Pt2_512>
  2177.  
  2178. 5.25" floppy, 1.2MB total space, 512 bytes/sector.
  2179.  
  2180. =item C<F3_1Pt44_512>
  2181.  
  2182. 3.5" floppy, 1.44MB total space, 512 bytes/sector.
  2183.  
  2184. =item C<F3_2Pt88_512>
  2185.  
  2186. 3.5" floppy, 2.88MB total space, 512 bytes/sector.
  2187.  
  2188. =item C<F3_20Pt8_512>
  2189.  
  2190. 3.5" floppy, 20.8MB total space, 512 bytes/sector.
  2191.  
  2192. =item C<F3_720_512>
  2193.  
  2194. 3.5" floppy, 720KB total space, 512 bytes/sector.
  2195.  
  2196. =item C<F5_360_512>
  2197.  
  2198. 5.25" floppy, 360KB total space, 512 bytes/sector.
  2199.  
  2200. =item C<F5_320_512>
  2201.  
  2202. 5.25" floppy, 320KB total space, 512 bytes/sector.
  2203.  
  2204. =item C<F5_320_1024>
  2205.  
  2206. 5.25" floppy, 320KB total space, 1024 bytes/sector.
  2207.  
  2208. =item C<F5_180_512>
  2209.  
  2210. 5.25" floppy, 180KB total space, 512 bytes/sector.
  2211.  
  2212. =item C<F5_160_512>
  2213.  
  2214. 5.25" floppy, 160KB total space, 512 bytes/sector.
  2215.  
  2216. =item C<RemovableMedia>
  2217.  
  2218. Some type of removable media other than a floppy diskette.
  2219.  
  2220. =item C<FixedMedia>
  2221.  
  2222. A fixed hard disk.
  2223.  
  2224. =item C<F3_120M_512>
  2225.  
  2226. 3.5" floppy, 120MB total space.
  2227.  
  2228. =back
  2229.  
  2230. =item C<":MOVEFILE_">
  2231.  
  2232. Constants for use in C<$uFlags> arguments to C<MoveFileEx>.
  2233.  
  2234.     MOVEFILE_COPY_ALLOWED        MOVEFILE_DELAY_UNTIL_REBOOT
  2235.     MOVEFILE_REPLACE_EXISTING    MOVEFILE_WRITE_THROUGH
  2236.  
  2237. =item C<":SECURITY_">
  2238.  
  2239. Security quality of service values that can be used in the C<$uFlags>
  2240. argument to C<CreateFile> if opening the client side of a named pipe.
  2241.  
  2242.     SECURITY_ANONYMOUS        SECURITY_CONTEXT_TRACKING
  2243.     SECURITY_DELEGATION        SECURITY_EFFECTIVE_ONLY
  2244.     SECURITY_IDENTIFICATION        SECURITY_IMPERSONATION
  2245.     SECURITY_SQOS_PRESENT
  2246.  
  2247. =item C<":SEM_">
  2248.  
  2249. Constants to be used with C<SetErrorMode>.
  2250.  
  2251.     SEM_FAILCRITICALERRORS        SEM_NOGPFAULTERRORBOX
  2252.     SEM_NOALIGNMENTFAULTEXCEPT    SEM_NOOPENFILEERRORBOX
  2253.  
  2254. =item C<":PARTITION_">
  2255.  
  2256. Constants describing partition types.
  2257.  
  2258.     PARTITION_ENTRY_UNUSED        PARTITION_FAT_12
  2259.     PARTITION_XENIX_1        PARTITION_XENIX_2
  2260.     PARTITION_FAT_16        PARTITION_EXTENDED
  2261.     PARTITION_HUGE            PARTITION_IFS
  2262.     PARTITION_FAT32            PARTITION_FAT32_XINT13
  2263.     PARTITION_XINT13        PARTITION_XINT13_EXTENDED
  2264.     PARTITION_PREP            PARTITION_UNIX
  2265.     VALID_NTFT            PARTITION_NTFT
  2266.  
  2267. =item C<":ALL">
  2268.  
  2269. All of the above.
  2270.  
  2271. =back
  2272.  
  2273. =head1 BUGS
  2274.  
  2275. None known at this time.
  2276.  
  2277. =head1 AUTHOR
  2278.  
  2279. Tye McQueen, tye@metronet.com, http://www.metronet.com/~tye/.
  2280.  
  2281. =head1 SEE ALSO
  2282.  
  2283. The pyramids.
  2284.  
  2285. =cut
  2286.