home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / File.pm < prev    next >
Text File  |  2004-01-12  |  93KB  |  2,894 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 Config;
  9. use integer;
  10. use vars qw( $VERSION @ISA );
  11. use vars qw( @EXPORT @EXPORT_OK @EXPORT_FAIL %EXPORT_TAGS );
  12. $VERSION= '0.09';
  13.  
  14. use base qw( Exporter DynaLoader Tie::Handle IO::File );
  15.  
  16. use constant FALSE => 0;
  17. use constant TRUE  => 1;
  18.  
  19. # Math::BigInt optimizations courtesy of Tels
  20. BEGIN {
  21.     require Math::BigInt;
  22.     Math::BigInt->import(lib => 'GMP') if $Math::BigInt::VERSION >= 1.60;
  23. }
  24.  
  25. my $_64BITINT  = defined $Config{use64bitint} &&
  26.          $Config{use64bitint} eq 'define';
  27.  
  28. my $THIRTY_TWO = $_64BITINT ? 32 : new Math::BigInt 32;
  29.  
  30. my $FFFFFFFF   = $_64BITINT ? 0xFFFFFFFF : new Math::BigInt 0xFFFFFFFF;
  31.         
  32. @EXPORT= qw();
  33. %EXPORT_TAGS= (
  34.     Func =>    [qw(        attrLetsToBits        createFile
  35.         fileConstant        fileLastError        getLogicalDrives
  36.     CloseHandle        CopyFile        CreateFile
  37.     DefineDosDevice        DeleteFile        DeviceIoControl
  38.     FdGetOsFHandle        GetDriveType        GetFileType
  39.     GetHandleInformation    GetLogicalDrives    GetLogicalDriveStrings
  40.     GetOsFHandle        GetVolumeInformation    IsRecognizedPartition
  41.     IsContainerPartition    MoveFile        MoveFileEx
  42.     OsFHandleOpen        OsFHandleOpenFd        QueryDosDevice
  43.     ReadFile        SetErrorMode        SetFilePointer
  44.     SetHandleInformation    WriteFile        GetFileSize
  45.     getFileSize        setFilePointer        GetOverlappedResult)],
  46.     FuncA =>    [qw(
  47.     CopyFileA        CreateFileA        DefineDosDeviceA
  48.     DeleteFileA        GetDriveTypeA        GetLogicalDriveStringsA
  49.     GetVolumeInformationA    MoveFileA        MoveFileExA
  50.     QueryDosDeviceA )],
  51.     FuncW =>    [qw(
  52.     CopyFileW        CreateFileW        DefineDosDeviceW
  53.     DeleteFileW        GetDriveTypeW        GetLogicalDriveStringsW
  54.     GetVolumeInformationW    MoveFileW        MoveFileExW
  55.     QueryDosDeviceW )],
  56.     Misc =>        [qw(
  57.     CREATE_ALWAYS        CREATE_NEW        FILE_BEGIN
  58.     FILE_CURRENT        FILE_END        INVALID_HANDLE_VALUE
  59.     OPEN_ALWAYS        OPEN_EXISTING        TRUNCATE_EXISTING )],
  60.     DDD_ =>    [qw(
  61.     DDD_EXACT_MATCH_ON_REMOVE            DDD_RAW_TARGET_PATH
  62.     DDD_REMOVE_DEFINITION )],
  63.     DRIVE_ =>    [qw(
  64.     DRIVE_UNKNOWN        DRIVE_NO_ROOT_DIR    DRIVE_REMOVABLE
  65.     DRIVE_FIXED        DRIVE_REMOTE        DRIVE_CDROM
  66.     DRIVE_RAMDISK )],
  67.     FILE_ =>    [qw(
  68.     FILE_READ_DATA            FILE_LIST_DIRECTORY
  69.     FILE_WRITE_DATA            FILE_ADD_FILE
  70.     FILE_APPEND_DATA        FILE_ADD_SUBDIRECTORY
  71.     FILE_CREATE_PIPE_INSTANCE    FILE_READ_EA
  72.     FILE_WRITE_EA            FILE_EXECUTE
  73.     FILE_TRAVERSE            FILE_DELETE_CHILD
  74.     FILE_READ_ATTRIBUTES        FILE_WRITE_ATTRIBUTES
  75.     FILE_ALL_ACCESS            FILE_GENERIC_READ
  76.     FILE_GENERIC_WRITE        FILE_GENERIC_EXECUTE )],
  77.     FILE_ATTRIBUTE_ =>    [qw(
  78.     FILE_ATTRIBUTE_ARCHIVE        FILE_ATTRIBUTE_COMPRESSED
  79.     FILE_ATTRIBUTE_HIDDEN        FILE_ATTRIBUTE_NORMAL
  80.     FILE_ATTRIBUTE_OFFLINE        FILE_ATTRIBUTE_READONLY
  81.     FILE_ATTRIBUTE_SYSTEM        FILE_ATTRIBUTE_TEMPORARY )],
  82.     FILE_FLAG_ =>    [qw(
  83.     FILE_FLAG_BACKUP_SEMANTICS    FILE_FLAG_DELETE_ON_CLOSE
  84.     FILE_FLAG_NO_BUFFERING        FILE_FLAG_OVERLAPPED
  85.     FILE_FLAG_POSIX_SEMANTICS    FILE_FLAG_RANDOM_ACCESS
  86.     FILE_FLAG_SEQUENTIAL_SCAN    FILE_FLAG_WRITE_THROUGH )],
  87.     FILE_SHARE_ =>    [qw(
  88.     FILE_SHARE_DELETE    FILE_SHARE_READ        FILE_SHARE_WRITE )],
  89.     FILE_TYPE_ =>    [qw(
  90.     FILE_TYPE_CHAR        FILE_TYPE_DISK        FILE_TYPE_PIPE
  91.     FILE_TYPE_UNKNOWN )],
  92.     FS_ =>    [qw(
  93.     FS_CASE_IS_PRESERVED        FS_CASE_SENSITIVE
  94.     FS_UNICODE_STORED_ON_DISK    FS_PERSISTENT_ACLS 
  95.     FS_FILE_COMPRESSION        FS_VOL_IS_COMPRESSED )],
  96.     HANDLE_FLAG_ =>    [qw(
  97.     HANDLE_FLAG_INHERIT        HANDLE_FLAG_PROTECT_FROM_CLOSE )],
  98.     IOCTL_STORAGE_ =>    [qw(
  99.     IOCTL_STORAGE_CHECK_VERIFY    IOCTL_STORAGE_MEDIA_REMOVAL
  100.     IOCTL_STORAGE_EJECT_MEDIA    IOCTL_STORAGE_LOAD_MEDIA
  101.     IOCTL_STORAGE_RESERVE        IOCTL_STORAGE_RELEASE
  102.     IOCTL_STORAGE_FIND_NEW_DEVICES    IOCTL_STORAGE_GET_MEDIA_TYPES
  103.     )],
  104.     IOCTL_DISK_ =>    [qw(
  105.     IOCTL_DISK_FORMAT_TRACKS    IOCTL_DISK_FORMAT_TRACKS_EX
  106.     IOCTL_DISK_GET_DRIVE_GEOMETRY    IOCTL_DISK_GET_DRIVE_LAYOUT
  107.     IOCTL_DISK_GET_MEDIA_TYPES    IOCTL_DISK_GET_PARTITION_INFO
  108.     IOCTL_DISK_HISTOGRAM_DATA    IOCTL_DISK_HISTOGRAM_RESET
  109.     IOCTL_DISK_HISTOGRAM_STRUCTURE    IOCTL_DISK_IS_WRITABLE
  110.     IOCTL_DISK_LOGGING        IOCTL_DISK_PERFORMANCE
  111.     IOCTL_DISK_REASSIGN_BLOCKS    IOCTL_DISK_REQUEST_DATA
  112.     IOCTL_DISK_REQUEST_STRUCTURE    IOCTL_DISK_SET_DRIVE_LAYOUT
  113.     IOCTL_DISK_SET_PARTITION_INFO    IOCTL_DISK_VERIFY )],
  114.     GENERIC_ =>        [qw(
  115.     GENERIC_ALL            GENERIC_EXECUTE
  116.     GENERIC_READ            GENERIC_WRITE )],
  117.     MEDIA_TYPE =>    [qw(
  118.     Unknown            F5_1Pt2_512        F3_1Pt44_512
  119.     F3_2Pt88_512        F3_20Pt8_512        F3_720_512
  120.     F5_360_512        F5_320_512        F5_320_1024
  121.     F5_180_512        F5_160_512        RemovableMedia
  122.     FixedMedia        F3_120M_512 )],
  123.     MOVEFILE_ =>    [qw(
  124.     MOVEFILE_COPY_ALLOWED        MOVEFILE_DELAY_UNTIL_REBOOT
  125.     MOVEFILE_REPLACE_EXISTING    MOVEFILE_WRITE_THROUGH )],
  126.     SECURITY_ =>    [qw(
  127.     SECURITY_ANONYMOUS        SECURITY_CONTEXT_TRACKING
  128.     SECURITY_DELEGATION        SECURITY_EFFECTIVE_ONLY
  129.     SECURITY_IDENTIFICATION        SECURITY_IMPERSONATION
  130.     SECURITY_SQOS_PRESENT )],
  131.     SEM_ =>        [qw(
  132.     SEM_FAILCRITICALERRORS        SEM_NOGPFAULTERRORBOX
  133.     SEM_NOALIGNMENTFAULTEXCEPT    SEM_NOOPENFILEERRORBOX )],
  134.     PARTITION_ =>    [qw(
  135.     PARTITION_ENTRY_UNUSED        PARTITION_FAT_12
  136.     PARTITION_XENIX_1        PARTITION_XENIX_2
  137.     PARTITION_FAT_16        PARTITION_EXTENDED
  138.     PARTITION_HUGE            PARTITION_IFS
  139.     PARTITION_FAT32            PARTITION_FAT32_XINT13
  140.     PARTITION_XINT13        PARTITION_XINT13_EXTENDED
  141.     PARTITION_PREP            PARTITION_UNIX
  142.     VALID_NTFT            PARTITION_NTFT )],
  143. );
  144. @EXPORT_OK= ();
  145. {
  146.     my $key;
  147.     foreach $key (  keys(%EXPORT_TAGS)  ) {
  148.     push( @EXPORT_OK, @{$EXPORT_TAGS{$key}} );
  149.     #push( @EXPORT_FAIL, @{$EXPORT_TAGS{$key}} )   unless  $key =~ /^Func/;
  150.     }
  151. }
  152. $EXPORT_TAGS{ALL}= \@EXPORT_OK;
  153.  
  154. bootstrap Win32API::File $VERSION;
  155.  
  156. # Preloaded methods go here.
  157.  
  158. # To convert C constants to Perl code in cFile.pc
  159. # [instead of C or C++ code in cFile.h]:
  160. #    * Modify F<Makefile.PL> to add WriteMakeFile() =>
  161. #      CONST2PERL/postamble => [[ "Win32API::File" => ]] WRITE_PERL => 1.
  162. #    * Either comment out C<#include "cFile.h"> from F<File.xs>
  163. #      or make F<cFile.h> an empty file.
  164. #    * Make sure the following C<if> block is not commented out.
  165. #    * "nmake clean", "perl Makefile.PL", "nmake"
  166.  
  167. if(  ! defined &GENERIC_READ  ) {
  168.     require "Win32API/File/cFile.pc";
  169. }
  170.  
  171. sub fileConstant
  172. {
  173.     my( $name )= @_;
  174.     if(  1 != @_  ||  ! $name  ||  $name =~ /\W/  ) {
  175.     require Carp;
  176.     Carp::croak( 'Usage: ',__PACKAGE__,'::fileConstant("CONST_NAME")' );
  177.     }
  178.     my $proto= prototype $name;
  179.     if(  defined \&$name
  180.      &&  defined $proto
  181.      &&  "" eq $proto  ) {
  182.     no strict 'refs';
  183.     return &$name;
  184.     }
  185.     return undef;
  186. }
  187.  
  188. # We provide this for backwards compatibility:
  189. sub constant
  190. {
  191.     my( $name )= @_;
  192.     my $value= fileConstant( $name );
  193.     if(  defined $value  ) {
  194.     $!= 0;
  195.     return $value;
  196.     }
  197.     $!= 11; # EINVAL
  198.     return 0;
  199. }
  200.  
  201. package Win32API::File::_error;
  202.  
  203. use overload
  204.   '""' => sub {
  205.     use Win32;
  206.     $_ = Win32::FormatMessage(Win32API::File::_fileLastError());
  207.     tr/\r\n//d; return $_;
  208.   },
  209.   '0+' => sub { Win32API::File::_fileLastError() },
  210.   'fallback' => 1;
  211.  
  212. sub new { return bless {}, shift }
  213. sub set { Win32API::File::_fileLastError($_[1]); return $_[0] }
  214.  
  215. package Win32API::File;
  216.  
  217. my $_error = new Win32API::File::_error;
  218.  
  219. sub fileLastError {
  220.     croak 'Usage: ',__PACKAGE__,'::fileLastError( [$setWin32ErrCode] )'
  221.         if @_ > 1;
  222.     $_error->set($_[0]) if defined $_[0];
  223.     return $_error;
  224. }
  225.  
  226. # Since we ISA DynaLoader which ISA AutoLoader, we ISA AutoLoader so we
  227. # need this next chunk to prevent Win32API::File->nonesuch() from
  228. # looking for "nonesuch.al" and producing confusing error messages:
  229. use vars qw($AUTOLOAD);
  230. sub AUTOLOAD {
  231.     require Carp;
  232.     Carp::croak(
  233.       "Can't locate method $AUTOLOAD via package Win32API::File" );
  234. }
  235.  
  236. # Replace "&rout;" with "goto &rout;" when that is supported on Win32.
  237.  
  238. # Aliases for non-Unicode functions:
  239. sub CopyFile            { &CopyFileA; }
  240. sub CreateFile            { &CreateFileA; }
  241. sub DefineDosDevice        { &DefineDosDeviceA; }
  242. sub DeleteFile            { &DeleteFileA; }
  243. sub GetDriveType        { &GetDriveTypeA; }
  244. sub GetLogicalDriveStrings    { &GetLogicalDriveStringsA; }
  245. sub GetVolumeInformation    { &GetVolumeInformationA; }
  246. sub MoveFile            { &MoveFileA; }
  247. sub MoveFileEx            { &MoveFileExA; }
  248. sub QueryDosDevice        { &QueryDosDeviceA; }
  249.  
  250. sub OsFHandleOpen {
  251.     if(  3 != @_  ) {
  252.     croak 'Win32API::File Usage:  ',
  253.           'OsFHandleOpen(FILE,$hNativeHandle,"rwatb")';
  254.     }
  255.     my( $fh, $osfh, $access )= @_;
  256.     if(  ! ref($fh)  ) {
  257.     if(  $fh !~ /('|::)/  ) {
  258.         $fh= caller() . "::" . $fh;
  259.     }
  260.     no strict "refs";
  261.     $fh= \*{$fh};
  262.     }
  263.     my( $mode, $pref );
  264.     if(  $access =~ /r/i  ) {
  265.     if(  $access =~ /w/i  ) {
  266.         $mode= O_RDWR;
  267.         $pref= "+<";
  268.     } else {
  269.         $mode= O_RDONLY;
  270.         $pref= "<";
  271.     }
  272.     } else {
  273.     if(  $access =~ /w/i  ) {
  274.         $mode= O_WRONLY;
  275.         $pref= ">";
  276.     } else {
  277.     #   croak qq<Win32API::File::OsFHandleOpen():  >,
  278.     #      qq<Access ($access) missing both "r" and "w">;
  279.         $mode= O_RDONLY;
  280.         $pref= "<";
  281.     }
  282.     }
  283.     $mode |= O_APPEND   if  $access =~ /a/i;
  284.     #$mode |= O_TEXT   if  $access =~ /t/i;
  285.     # Some versions of the Fcntl module are broken and won't autoload O_TEXT:
  286.     if(  $access =~ /t/i  ) {
  287.     my $o_text= eval "O_TEXT";
  288.     $o_text= 0x4000   if  $@;
  289.     $mode |= $o_text;
  290.     }
  291.     $mode |= O_BINARY   if  $access =~ /b/i;
  292.     undef $@;
  293.     my $fd = eval {
  294.     OsFHandleOpenFd( $osfh, $mode );
  295.     }; if ($@) {
  296.     return tie *{$fh}, __PACKAGE__, $osfh;
  297.     } else {
  298.     return  undef   if  $fd < 0;
  299.     return  open( $fh, $pref."&=".$fd );
  300.     }
  301. }
  302.  
  303. sub GetOsFHandle {
  304.     if(  1 != @_  ) {
  305.     croak 'Win32API::File Usage:  $OsFHandle= GetOsFHandle(FILE)';
  306.     }
  307.     my( $file )= @_;
  308.     if(  ! ref($file)  ) {
  309.     if(  $file !~ /('|::)/  ) {
  310.         $file= caller() . "::" . $file;
  311.     }
  312.     no strict "refs";
  313.      
  314. # The eval "" is necessary in Perl 5.6, avoid it otherwise.
  315.     my $tied = !defined($^]) || $^] < 5.008 ?
  316.         eval "tied *{$file}" :
  317.         tied *{$file};
  318.  
  319.     if (UNIVERSAL::isa($tied => __PACKAGE__)) {
  320.         return $tied->win32_handle;
  321.     }
  322.  
  323.     $file= *{$file};
  324.     }
  325.     my( $fd )= fileno($file);
  326.     if(  ! defined( $fd )  ) {
  327.     if(  $file =~ /^\d+\Z/  ) {
  328.         $fd= $file;
  329.     } else {
  330.         return ();    # $! should be set by fileno().
  331.     }
  332.     }
  333.     my $h= FdGetOsFHandle( $fd );
  334.     if(  INVALID_HANDLE_VALUE() == $h  ) {
  335.     $h= "";
  336.     } elsif(  "0" eq $h  ) {
  337.     $h= "0 but true";
  338.     }
  339.     return $h;
  340. }
  341.  
  342. sub getFileSize {
  343.     croak 'Win32API::File Usage:  $size= getFileSize($hNativeHandle)'
  344.         if @_ != 1;
  345.  
  346.     my $handle    = shift;
  347.     my $high_size = 0;
  348.  
  349.     my $low_size = GetFileSize($handle, $high_size);
  350.  
  351.     my $retval = $_64BITINT ?
  352.         $high_size : new Math::BigInt $high_size;
  353.  
  354.     $retval <<= $THIRTY_TWO;
  355.     $retval +=  $low_size;
  356.  
  357.     return $retval;
  358. }
  359.  
  360. sub setFilePointer {
  361.     croak 'Win32API::File Usage:  $pos= setFilePointer($hNativeHandle, $posl, $from_where)'
  362.         if @_ != 3;
  363.  
  364.     my ($handle, $pos, $from_where) = @_;
  365.  
  366.     my ($pos_low, $pos_high) = ($pos, 0);
  367.  
  368.     if ($_64BITINT) {
  369.         $pos_low  = ($pos & $FFFFFFFF);
  370.         $pos_high = (($pos >> $THIRTY_TWO) & $FFFFFFFF);
  371.     } elsif (UNIVERSAL::isa($pos => 'Math::BigInt')) {
  372.         $pos_low  = ($pos & $FFFFFFFF)->numify();
  373.         $pos_high = (($pos >> $THIRTY_TWO) & $FFFFFFFF)->numify();
  374.     }
  375.  
  376.     my $retval = SetFilePointer($handle, $pos_low, $pos_high, $from_where);
  377.  
  378.     if (defined $pos_high && $pos_high != 0) {
  379.         $retval   = new Math::BigInt $retval   unless $_64BITINT;
  380.         $pos_high = new Math::BigInt $pos_high unless $_64BITINT;
  381.  
  382.         $retval += $pos_high << $THIRTY_TWO;
  383.     }
  384.  
  385.     return $retval;
  386. }
  387.  
  388. sub attrLetsToBits
  389. {
  390.     my( $lets )= @_;
  391.     my( %a )= (
  392.       "a"=>FILE_ATTRIBUTE_ARCHIVE(),    "c"=>FILE_ATTRIBUTE_COMPRESSED(),
  393.       "h"=>FILE_ATTRIBUTE_HIDDEN(),    "o"=>FILE_ATTRIBUTE_OFFLINE(),
  394.       "r"=>FILE_ATTRIBUTE_READONLY(),    "s"=>FILE_ATTRIBUTE_SYSTEM(),
  395.       "t"=>FILE_ATTRIBUTE_TEMPORARY() );
  396.     my( $bits )= 0;
  397.     foreach(  split(//,$lets)  ) {
  398.     croak "Win32API::File::attrLetsToBits: Unknown attribute letter ($_)"
  399.       unless  exists $a{$_};
  400.     $bits |= $a{$_};
  401.     }
  402.     return $bits;
  403. }
  404.  
  405. use vars qw( @_createFile_Opts %_createFile_Opts );
  406. @_createFile_Opts= qw( Access Create Share Attributes
  407.                Flags Security Model );
  408. @_createFile_Opts{@_createFile_Opts}= (1) x @_createFile_Opts;
  409.  
  410. sub createFile
  411. {
  412.     my $opts= "";
  413.     if(  2 <= @_  &&  "HASH" eq ref($_[$#_])  ) {
  414.     $opts= pop( @_ );
  415.     }
  416.     my( $sPath, $svAccess, $svShare )= @_;
  417.     if(  @_ < 1  ||  3 < @_  ) {
  418.     croak "Win32API::File::createFile() usage:  \$hObject= createFile(\n",
  419.           "  \$sPath, [\$svAccess_qrw_ktn_ce,[\$svShare_rwd,]]",
  420.           " [{Option=>\$Value}] )\n",
  421.           "    options: @_createFile_Opts\nCalled";
  422.     }
  423.     my( $create, $flags, $sec, $model )= ( "", 0, [], 0 );
  424.     if(  ref($opts)  ) {
  425.         my @err= grep( ! $_createFile_Opts{$_}, keys(%$opts) );
  426.     @err  and  croak "_createFile:  Invalid options (@err)";
  427.     $flags= $opts->{Flags}        if  exists( $opts->{Flags} );
  428.     $flags |= attrLetsToBits( $opts->{Attributes} )
  429.                     if  exists( $opts->{Attributes} );
  430.     $sec= $opts->{Security}        if  exists( $opts->{Security} );
  431.     $model= $opts->{Model}        if  exists( $opts->{Model} );
  432.     $svAccess= $opts->{Access}    if  exists( $opts->{Access} );
  433.     $create= $opts->{Create}    if  exists( $opts->{Create} );
  434.     $svShare= $opts->{Share}    if  exists( $opts->{Share} );
  435.     }
  436.     $svAccess= "r"        unless  defined($svAccess);
  437.     $svShare= "rw"        unless  defined($svShare);
  438.     if(  $svAccess =~ /^[qrw ktn ce]*$/i  ) {
  439.     ( my $c= $svAccess ) =~ tr/qrw QRW//d;
  440.     $create= $c   if  "" ne $c  &&  "" eq $create;
  441.     local( $_ )= $svAccess;
  442.     $svAccess= 0;
  443.     $svAccess |= GENERIC_READ()   if  /r/i;
  444.     $svAccess |= GENERIC_WRITE()   if  /w/i;
  445.     } elsif(  "?" eq $svAccess  ) {
  446.     croak
  447.       "Win32API::File::createFile:  \$svAccess can use the following:\n",
  448.           "    One or more of the following:\n",
  449.           "\tq -- Query access (same as 0)\n",
  450.           "\tr -- Read access (GENERIC_READ)\n",
  451.           "\tw -- Write access (GENERIC_WRITE)\n",
  452.           "    At most one of the following:\n",
  453.           "\tk -- Keep if exists\n",
  454.           "\tt -- Truncate if exists\n",
  455.           "\tn -- New file only (fail if file already exists)\n",
  456.           "    At most one of the following:\n",
  457.           "\tc -- Create if doesn't exist\n",
  458.           "\te -- Existing file only (fail if doesn't exist)\n",
  459.           "  ''   is the same as 'q  k e'\n",
  460.           "  'r'  is the same as 'r  k e'\n",
  461.           "  'w'  is the same as 'w  t c'\n",
  462.           "  'rw' is the same as 'rw k c'\n",
  463.           "  'rt' or 'rn' implies 'c'.\n",
  464.           "  Or \$svAccess can be numeric.\n", "Called from";
  465.     } elsif(  $svAccess == 0  &&  $svAccess !~ /^[-+.]*0/  ) {
  466.     croak "Win32API::File::createFile:  Invalid \$svAccess ($svAccess)";
  467.     }
  468.     if(  $create =~ /^[ktn ce]*$/  ) {
  469.         local( $_ )= $create;
  470.         my( $k, $t, $n, $c, $e )= ( scalar(/k/i), scalar(/t/i),
  471.       scalar(/n/i), scalar(/c/i), scalar(/e/i) );
  472.     if(  1 < $k + $t + $n  ) {
  473.         croak "Win32API::File::createFile: \$create must not use ",
  474.           qq<more than one of "k", "t", and "n" ($create)>;
  475.     }
  476.     if(  $c  &&  $e  ) {
  477.         croak "Win32API::File::createFile: \$create must not use ",
  478.           qq<both "c" and "e" ($create)>;
  479.     }
  480.     my $r= ( $svAccess & GENERIC_READ() ) == GENERIC_READ();
  481.     my $w= ( $svAccess & GENERIC_WRITE() ) == GENERIC_WRITE();
  482.     if(  ! $k  &&  ! $t  &&  ! $n  ) {
  483.         if(  $w  &&  ! $r  ) {        $t= 1;
  484.         } else {                $k= 1; }
  485.     }
  486.     if(  $k  ) {
  487.         if(  $c  ||  $w && ! $e  ) {    $create= OPEN_ALWAYS();
  488.         } else {                $create= OPEN_EXISTING(); }
  489.     } elsif(  $t  ) {
  490.         if(  $e  ) {            $create= TRUNCATE_EXISTING();
  491.         } else {                $create= CREATE_ALWAYS(); }
  492.     } else { # $n
  493.         if(  ! $e  ) {            $create= CREATE_NEW();
  494.         } else {
  495.         croak "Win32API::File::createFile: \$create must not use ",
  496.           qq<both "n" and "e" ($create)>;
  497.         }
  498.     }
  499.     } elsif(  "?" eq $create  ) {
  500.     croak 'Win32API::File::createFile: $create !~ /^[ktn ce]*$/;',
  501.           ' pass $svAccess as "?" for more information.';
  502.     } elsif(  $create == 0  &&  $create ne "0"  ) {
  503.     croak "Win32API::File::createFile: Invalid \$create ($create)";
  504.     }
  505.     if(  $svShare =~ /^[drw]*$/  ) {
  506.         my %s= ( "d"=>FILE_SHARE_DELETE(), "r"=>FILE_SHARE_READ(),
  507.              "w"=>FILE_SHARE_WRITE() );
  508.         my @s= split(//,$svShare);
  509.     $svShare= 0;
  510.     foreach( @s ) {
  511.         $svShare |= $s{$_};
  512.     }
  513.     } elsif(  $svShare == 0  &&  $svShare !~ /^[-+.]*0/  ) {
  514.     croak "Win32API::File::createFile: Invalid \$svShare ($svShare)";
  515.     }
  516.     return  CreateFileA(
  517.           $sPath, $svAccess, $svShare, $sec, $create, $flags, $model );
  518. }
  519.  
  520.  
  521. sub getLogicalDrives
  522. {
  523.     my( $ref )= @_;
  524.     my $s= "";
  525.     if(  ! GetLogicalDriveStringsA( 256, $s )  ) {
  526.     return undef;
  527.     }
  528.     if(  ! defined($ref)  ) {
  529.     return  split( /\0/, $s );
  530.     } elsif(  "ARRAY" ne ref($ref)  ) {
  531.     croak 'Usage:  C<@arr= getLogicalDrives()> ',
  532.           'or C<getLogicalDrives(\\@arr)>', "\n";
  533.     }
  534.     @$ref= split( /\0/, $s );
  535.     return $ref;
  536. }
  537.  
  538. ###############################################################################
  539. #   Experimental Tied Handle and Object Oriented interface.                   #
  540. ###############################################################################
  541.  
  542. sub new {
  543.     my $class = shift;
  544.     $class = ref $class || $class;
  545.  
  546.     my $self = IO::File::new($class);
  547.     tie *$self, __PACKAGE__;
  548.  
  549.     $self->open(@_) if @_;
  550.  
  551.     return $self;
  552. }
  553.  
  554. sub TIEHANDLE {
  555.     my ($class, $win32_handle) = @_;
  556.     $class = ref $class || $class;
  557.  
  558.     return bless {
  559.         _win32_handle => $win32_handle,
  560.         _binmode      => FALSE,
  561.         _buffered     => FALSE,
  562.         _buffer       => '',
  563.         _eof          => FALSE,
  564.         _fileno       => undef,
  565.         _access       => 'r',
  566.         _append       => FALSE,
  567.     }, $class;
  568. }
  569.  
  570. # This is called for getting the tied object from hard refs to glob refs in
  571. # some cases, for reasons I don't quite grok.
  572.  
  573. sub FETCH { return $_[0] }
  574.  
  575. # Public accessors
  576.  
  577. sub win32_handle{ $_[0]->{_win32_handle}||= $_[1] }
  578.  
  579. # Protected accessors
  580.  
  581. sub _buffer    { $_[0]->{_buffer}    ||= $_[1] }
  582. sub _binmode    { $_[0]->{_binmode}    ||= $_[1] }
  583. sub _fileno    { $_[0]->{_fileno}    ||= $_[1] }
  584. sub _access    { $_[0]->{_access}    ||= $_[1] }
  585. sub _append    { $_[0]->{_append}    ||= $_[1] }
  586.  
  587. # Tie interface
  588.  
  589. sub OPEN {
  590.     my $self  = shift;
  591.     my $expr  = shift;
  592.     croak "Only the two argument form of open is supported at this time" if @_;
  593. # FIXME: this needs to parse the full Perl open syntax in $expr
  594.  
  595.     my ($mixed, $mode, $path) =
  596.         ($expr =~ /^\s* (\+)? \s* (<|>|>>)? \s* (.*?) \s*$/x);
  597.  
  598.     croak "Unsupported open mode" if not $path;
  599.  
  600.     my $access = 'r';
  601.     my $append = $mode eq '>>' ? TRUE : FALSE;
  602.  
  603.     if ($mixed) {
  604.         $access = 'rw';
  605.     } elsif($mode eq '>') {
  606.         $access = 'w';
  607.     }
  608.  
  609.     my $w32_handle = createFile($path, $access);
  610.  
  611.     $self->win32_handle($w32_handle);
  612.  
  613.     $self->seek(1,2) if $append;
  614.  
  615.     $self->_access($access);
  616.     $self->_append($append);
  617.  
  618.     return TRUE;
  619. }
  620.  
  621. sub BINMODE {
  622.     $_[0]->_binmode(TRUE);
  623. }
  624.  
  625. sub WRITE {
  626.     my ($self, $buf, $len, $offset, $overlap) = @_;
  627.  
  628.     if ($offset) {
  629.         $buf = substr($buf, $offset);
  630.         $len = length($buf);
  631.     }
  632.  
  633.     $len       = length($buf) if not defined $len;
  634.  
  635.     $overlap   = [] if not defined $overlap;;
  636.  
  637.     my $bytes_written = 0;
  638.  
  639.     WriteFile (
  640.         $self->win32_handle, $buf, $len,
  641.         $bytes_written, $overlap
  642.     );
  643.  
  644.     return $bytes_written;
  645. }
  646.  
  647. sub PRINT {
  648.     my $self = shift;
  649.  
  650.     my $buf = join defined $, ? $, : "" => @_;
  651.  
  652.     $buf =~ s/\012/\015\012/sg unless $self->_binmode();
  653.  
  654.     $buf .= $\ if defined $\;
  655.  
  656.     $self->WRITE($buf, length($buf), 0);
  657. }
  658.  
  659. sub READ {
  660.     my $self = shift;
  661.     my $into = \$_[0]; shift;
  662.     my ($len, $offset, $overlap) = @_;
  663.  
  664.     my $buffer     = defined $self->_buffer ? $self->_buffer : "";
  665.     my $buf_length = length($buffer);
  666.     my $bytes_read = 0;
  667.     my $data;
  668.     $offset        = 0 if not defined $offset;
  669.  
  670.     if ($buf_length >= $len) {
  671.         $data       = substr($buffer, 0, $len => "");
  672.         $bytes_read = $len;
  673.         $self->_buffer($buffer);
  674.     } else {
  675.         if ($buf_length > 0) {
  676.             $len -= $buf_length;
  677.             substr($$into, $offset) = $buffer;
  678.             $offset += $buf_length;
  679.         }
  680.  
  681.         $overlap ||= [];
  682.  
  683.         ReadFile (
  684.             $self->win32_handle, $data, $len,
  685.             $bytes_read, $overlap
  686.         );
  687.     }
  688.  
  689.     $$into = "" if not defined $$into;
  690.  
  691.     substr($$into, $offset) = $data;
  692.  
  693.     return $bytes_read;
  694. }
  695.  
  696. sub READLINE {
  697.     my $self = shift;
  698.     my $line = "";
  699.  
  700.     while ((index $line, $/) == $[-1) { # read until end of line marker
  701.         my $char = $self->GETC();
  702.  
  703.         last if !defined $char || $char eq '';
  704.  
  705.         $line .= $char;
  706.     }
  707.  
  708.     return undef if $line eq '';
  709.  
  710.     return $line;
  711. }
  712.  
  713.  
  714. sub FILENO {
  715.     my $self = shift;
  716.  
  717.     return $self->_fileno() if defined $self->_fileno();
  718.  
  719.     return -1 if $^O eq 'cygwin';
  720.  
  721. # FIXME: We don't always open the handle, better to query the handle or to set
  722. # the right access info at TIEHANDLE time.
  723.  
  724.     my $access = $self->_access();
  725.     my $mode   = $access eq 'rw' ? O_RDWR :
  726.         $access eq 'w' ? O_WRONLY : O_RDONLY;
  727.  
  728.     $mode |= O_APPEND if $self->_append();
  729.  
  730.     $mode |= O_TEXT   if not $self->_binmode();
  731.  
  732.     return $self->_fileno ( OsfHandleOpenFd (
  733.         $self->win32_handle, $mode
  734.     ));
  735. }
  736.  
  737. sub SEEK {
  738.     my ($self, $pos, $whence) = @_;
  739.  
  740.     $whence = 0 if not defined $whence;
  741.     my @file_consts = map {
  742.         fileConstant($_)
  743.     } qw(FILE_BEGIN FILE_CURRENT FILE_END);
  744.  
  745.     my $from_where = $file_consts[$whence];
  746.  
  747.     return setFilePointer($self->win32_handle, $pos, $from_where);
  748. }
  749.  
  750. sub TELL {
  751. # SetFilePointer with position 0 at FILE_CURRENT will return position.
  752.     return $_[0]->SEEK(0, 1);
  753. }
  754.  
  755. sub EOF {
  756.     my $self = shift;
  757.  
  758.     my $current = $self->TELL() + 0;
  759.     my $end     = getFileSize($self->win32_handle) + 0;
  760.  
  761.     return $current == $end;
  762. }
  763.  
  764. sub CLOSE {
  765.     my $self = shift;
  766.  
  767.     my $retval = TRUE;
  768.     
  769.     if (defined $self->win32_handle) {
  770.         $retval = CloseHandle($self->win32_handle);
  771.  
  772.         $self->win32_handle(undef);
  773.     }
  774.  
  775.     return $retval;
  776. }
  777.  
  778. # Only close the handle on explicit close, too many problems otherwise.
  779. sub UNTIE {}
  780.  
  781. sub DESTROY {}
  782.  
  783. # End of Tie/OO Interface
  784.  
  785. # Autoload methods go after =cut, and are processed by the autosplit program.
  786.  
  787. 1;
  788. __END__
  789.  
  790. =head1 NAME
  791.  
  792. Win32API::File - Low-level access to Win32 system API calls for files/dirs.
  793.  
  794. =head1 SYNOPSIS
  795.  
  796.   use Win32API::File 0.08 qw( :ALL );
  797.  
  798.   MoveFile( $Source, $Destination )
  799.     or  die "Can't move $Source to $Destination: ",fileLastError(),"\n";
  800.   MoveFileEx( $Source, $Destination, MOVEFILE_REPLACE_EXISTING() )
  801.     or  die "Can't move $Source to $Destination: ",fileLastError(),"\n";
  802.   [...]
  803.  
  804. =head1 DESCRIPTION
  805.  
  806. This provides fairly low-level access to the Win32 System API
  807. calls dealing with files and directories.
  808.  
  809. To pass in C<NULL> as the pointer to an optional buffer, pass in
  810. an empty list reference, C<[]>.
  811.  
  812. Beyond raw access to the API calls and related constants, this module
  813. handles smart buffer allocation and translation of return codes.
  814.  
  815. All functions, unless otherwise noted, return a true value for success
  816. and a false value for failure and set C<$^E> on failure.
  817.  
  818. =head2 Object Oriented/Tied Handle Interface
  819.  
  820. WARNING: this is new code, use at your own risk.
  821.  
  822. This version of C<Win32API::File> can be used like an C<IO::File> object. Ie:
  823.  
  824.   my $file = new Win32API::File "+> foo";
  825.   binmode $file;
  826.   print $file "hello there\n";
  827.   seek $file, 0, 0;
  828.   my $line = <$file>;
  829.   $file->close;
  830.  
  831. It also supports tying via a win32 handle (for example, from C<createFile()>):
  832.  
  833.   tie FILE, 'Win32API::File', $win32_handle;
  834.   print FILE "...";
  835.  
  836. It has not been extensively tested yet and buffered I/O is not yet implemented.
  837.  
  838. =head2 Exports
  839.  
  840. Nothing is exported by default.  The following tags can be used to
  841. have large sets of symbols exported:  C<":Func">, C<":FuncA">,
  842. C<":FuncW">, C<":Misc">, C<":DDD_">, C<":DRIVE_">, C<":FILE_">,
  843. C<":FILE_ATTRIBUTE_">, C<":FILE_FLAG_">, C<":FILE_SHARE_">,
  844. C<":FILE_TYPE_">, C<":FS_">, C<":HANDLE_FLAG_">, C<":IOCTL_STORAGE_">,
  845. C<":IOCTL_DISK_">, C<":GENERIC_">, C<":MEDIA_TYPE">, C<":MOVEFILE_">,
  846. C<":SECURITY_">, C<":SEM_">, and C<":PARTITION_">.
  847.  
  848. =over
  849.  
  850. =item C<":Func">
  851.  
  852. The basic function names: C<attrLetsToBits>,       C<createFile>,
  853. C<fileConstant>,          C<fileLastError>,        C<getLogicalDrives>,
  854. C<CloseHandle>,           C<CopyFile>,             C<CreateFile>,
  855. C<DefineDosDevice>,       C<DeleteFile>,           C<DeviceIoControl>,
  856. C<FdGetOsFHandle>,        C<GetDriveType>,         C<GetFileType>,
  857. C<GetHandleInformation>,  C<GetLogicalDrives>,     C<GetLogicalDriveStrings>,
  858. C<GetOsFHandle>,          C<GetVolumeInformation>, C<IsRecognizedPartition>,
  859. C<IsContainerPartition>,  C<MoveFile>,             C<MoveFileEx>,
  860. C<OsFHandleOpen>,         C<OsFHandleOpenFd>,      C<QueryDosDevice>,
  861. C<ReadFile>,              C<SetErrorMode>,         C<SetFilePointer>,
  862. C<SetHandleInformation>,  C<GetFileSize>,          C<getFileSize>,
  863. C<setFilePointer>,        C<WriteFile> and         C<GetOverlappedResult>
  864.  
  865. =over
  866.  
  867. =item attrLetsToBits
  868.  
  869. =item C<$uBits= attrLetsToBits( $sAttributeLetters )>
  870.  
  871. Converts a string of file attribute letters into an unsigned value with
  872. the corresponding bits set.  C<$sAttributeLetters> should contain zero
  873. or more letters from C<"achorst">:
  874.  
  875. =over
  876.  
  877. =item C<"a">
  878.  
  879. C<FILE_ATTRIBUTE_ARCHIVE>
  880.  
  881. =item C<"c">
  882.  
  883. C<FILE_ATTRIBUTE_COMPRESSED>
  884.  
  885. =item C<"h">
  886.  
  887. C<FILE_ATTRIBUTE_HIDDEN>
  888.  
  889. =item C<"o">
  890.  
  891. C<FILE_ATTRIBUTE_OFFLINE>
  892.  
  893. =item C<"r">
  894.  
  895. C<FILE_ATTRIBUTE_READONLY>
  896.  
  897. =item C<"s">
  898.  
  899. C<FILE_ATTRIBUTE_SYSTEM>
  900.  
  901. =item C<"t">
  902.  
  903. C<FILE_ATTRIBUTE_TEMPORARY>
  904.  
  905. =back
  906.  
  907. =item createFile
  908.  
  909. =item C<$hObject= createFile( $sPath )>
  910.  
  911. =item C<$hObject= createFile( $sPath, $rvhvOptions )>
  912.  
  913. =item C<$hObject= createFile( $sPath, $svAccess )>
  914.  
  915. =item C<$hObject= createFile( $sPath, $svAccess, $rvhvOptions )>
  916.  
  917. =item C<$hObject= createFile( $sPath, $svAccess, $svShare )>
  918.  
  919. =item C<$hObject= createFile( $sPath, $svAccess, $svShare, $rvhvOptions )>
  920.  
  921. This is a Perl-friendly wrapper around C<CreateFile>.
  922.  
  923. On failure, C<$hObject> gets set to a false value and C<regLastError()>
  924. and C<$^E> are set to the reason for the failure.  Otherwise,
  925. C<$hObject> gets set to a Win32 native file handle which is alwasy
  926. a true value [returns C<"0 but true"> in the impossible(?) case of
  927. the handle having a value of C<0>].
  928.  
  929. C<$sPath> is the path to the file [or device, etc.] to be opened.  See
  930. C<CreateFile> for more information on possible special values for
  931. C<$sPath>.  
  932.  
  933. C<$svAccess> can be a number containing the bit mask representing
  934. the specific type(s) of access to the file that you desire.  See the
  935. C<$uAccess> parameter to C<CreateFile> for more information on these
  936. values.
  937.  
  938. More likely, C<$svAccess> is a string describing the generic type of
  939. access you desire and possibly the file creation options to use.  In
  940. this case, C<$svAccess> should contain zero or more characters from
  941. C<"qrw"> [access desired], zero or one character each from C<"ktn">
  942. and C<"ce">, and optional white space.  These letters stand for,
  943. respectively, "Query access", "Read access", "Write access", "Keep if
  944. exists", "Truncate if exists", "New file only", "Create if none", and
  945. "Existing file only".  Case is ignored.
  946.  
  947. You can pass in C<"?"> for C<$svAccess> to have an error message
  948. displayed summarizing its possible values.  This is very handy when
  949. doing on-the-fly programming using the Perl debugger:
  950.  
  951.     Win32API::File::createFile:  $svAccess can use the following:
  952.     One or more of the following:
  953.         q -- Query access (same as 0)
  954.         r -- Read access (GENERIC_READ)
  955.         w -- Write access (GENERIC_WRITE)
  956.     At most one of the following:
  957.         k -- Keep if exists
  958.         t -- Truncate if exists
  959.         n -- New file only (fail if file already exists)
  960.     At most one of the following:
  961.         c -- Create if doesn't exist
  962.         e -- Existing file only (fail if doesn't exist)
  963.       ''   is the same as 'q  k e'
  964.       'r'  is the same as 'r  k e'
  965.       'w'  is the same as 'w  t c'
  966.       'rw' is the same as 'rw k c'
  967.       'rt' or 'rn' implies 'c'.
  968.       Or $access can be numeric.
  969.  
  970. C<$svAccess> is designed to be "do what I mean", so you can skip
  971. the rest of its explanation unless you are interested in the complex
  972. details.  Note that, if you want write access to a device, you need
  973. to specify C<"k"> [and perhaps C<"e">, as in C<"w ke"> or C<"rw ke">]
  974. since Win32 suggests C<OPEN_EXISTING> be used when opening a device.
  975.  
  976. =over
  977.  
  978. =item C<"q"> 
  979.  
  980. Stands for "Query access".  This is really a no-op since you always have
  981. query access when you open a file.  You can specify C<"q"> to document
  982. that you plan to query the file [or device, etc.].  This is especially
  983. helpful when you don't want read nor write access since something like
  984. C<"q"> or C<"q ke"> may be easier to understand than just C<""> or C<"ke">.
  985.  
  986. =item C<"r">
  987.  
  988. Stands for "Read access".  Sets the C<GENERIC_READ> bit(s) in the
  989. C<$uAccess> that is passed to C<CreateFile>.  This is the default
  990. access if the C<$svAccess> parameter is missing [or if it is C<undef>
  991. and C<$rvhvOptions> doesn't specify an C<"Access"> option].
  992.  
  993. =item C<"w">
  994.  
  995. Stands for "Write access".  Sets the C<GENERIC_WRITE> bit(s) in the
  996. C<$uAccess> that is passed to C<CreateFile>.
  997.  
  998. =item C<"k">
  999.  
  1000. Stands for "Keep if exists".  If the requested file exists, then it is
  1001. opened.  This is the default unless C<GENERIC_WRITE> access has been
  1002. requested but C<GENERIC_READ> access has not been requested.   Contrast
  1003. with C<"t"> and C<"n">.
  1004.  
  1005. =item C<"t">
  1006.  
  1007. Stands for "Truncate if exists".  If the requested file exists, then
  1008. it is truncated to zero length and then opened.  This is the default if
  1009. C<GENERIC_WRITE> access has been requested and C<GENERIC_READ> access
  1010. has not been requested.  Contrast with C<"k"> and C<"n">.
  1011.  
  1012. =item C<"n">
  1013.  
  1014. Stands for "New file only".  If the requested file exists, then it is
  1015. not opened and the C<createFile> call fails.  Contrast with C<"k"> and
  1016. C<"t">.  Can't be used with C<"e">.
  1017.  
  1018. =item C<"c">
  1019.  
  1020. Stands for "Create if none".  If the requested file does not
  1021. exist, then it is created and then opened.  This is the default
  1022. if C<GENERIC_WRITE> access has been requested or if C<"t"> or
  1023. C<"n"> was specified.  Contrast with C<"e">.
  1024.  
  1025. =item C<"e">
  1026.  
  1027. Stands for "Existing file only".  If the requested file does not
  1028. exist, then nothing is opened and the C<createFile> call fails.  This
  1029. is the default unless C<GENERIC_WRITE> access has been requested or
  1030. C<"t"> or C<"n"> was specified.   Contrast with C<"c">.   Can't be
  1031. used with C<"n">.
  1032.  
  1033. =back
  1034.  
  1035. The characters from C<"ktn"> and C<"ce"> are combined to determine the
  1036. what value for C<$uCreate> to pass to C<CreateFile> [unless overridden
  1037. by C<$rvhvOptions>]:
  1038.  
  1039. =over
  1040.  
  1041. =item C<"kc">
  1042.  
  1043. C<OPEN_ALWAYS>
  1044.  
  1045. =item C<"ke">
  1046.  
  1047. C<OPEN_EXISTING>
  1048.  
  1049. =item C<"tc">
  1050.  
  1051. C<TRUNCATE_EXISTING>
  1052.  
  1053. =item C<"te">
  1054.  
  1055. C<CREATE_ALWAYS>
  1056.  
  1057. =item C<"nc">
  1058.  
  1059. C<CREATE_NEW>
  1060.  
  1061. =item C<"ne">
  1062.  
  1063. Illegal.
  1064.  
  1065. =back
  1066.  
  1067. C<$svShare> controls how the file is shared, that is, whether other
  1068. processes can have read, write, and/or delete access to the file while
  1069. we have it opened.  C<$svShare> will usually be a string containing zero
  1070. or more characters from C<"rwd"> but can also be a numeric bit mask.
  1071.  
  1072. C<"r"> sets the C<FILE_SHARE_READ> bit which allows other processes to have
  1073. read access to the file.  C<"w"> sets the C<FILE_SHARE_WRITE> bit which
  1074. allows other processes to have write access to the file.  C<"d"> sets the
  1075. C<FILE_SHARE_DELETE> bit which allows other processes to have delete access
  1076. to the file [ignored under Windows 95].
  1077.  
  1078. The default for C<$svShare> is C<"rw"> which provides the same sharing as
  1079. using regular perl C<open()>.
  1080.  
  1081. If another process currently has read, write, and/or delete access to
  1082. the file and you don't allow that level of sharing, then your call to
  1083. C<createFile> will fail.  If you requested read, write, and/or delete
  1084. access and another process already has the file open but doesn't allow
  1085. that level of sharing, then your call to C<createFile> will fail.  Once
  1086. you have the file open, if another process tries to open it with read,
  1087. write, and/or delete access and you don't allow that level of sharing,
  1088. then that process won't be allowed to open the file.
  1089.  
  1090. C<$rvhvOptions> is a reference to a hash where any keys must be from
  1091. the list C<qw( Access Create Share Attributes Flags Security Model )>.
  1092. The meaning of the value depends on the key name, as described below.
  1093. Any option values in C<$rvhvOptions> override the settings from
  1094. C<$svAccess> and C<$svShare> if they conflict.
  1095.  
  1096. =over
  1097.  
  1098. =item Flags => $uFlags
  1099.  
  1100. C<$uFlags> is an unsigned value having any of the C<FILE_FLAG_*> or
  1101. C<FILE_ATTRIBUTE_*> bits set.  Any C<FILE_ATTRIBUTE_*> bits set via the
  1102. C<Attributes> option are logically C<or>ed with these bits.  Defaults
  1103. to C<0>.
  1104.  
  1105. If opening the client side of a named pipe, then you can also specify
  1106. C<SECURITY_SQOS_PRESENT> along with one of the other C<SECURITY_*>
  1107. constants to specify the security quality of service to be used.
  1108.  
  1109. =item Attributes => $sAttributes
  1110.  
  1111. A string of zero or more characters from C<"achorst"> [see C<attrLetsToBits>
  1112. for more information] which are converted to C<FILE_ATTRIBUTE_*> bits to
  1113. be set in the C<$uFlags> argument passed to C<CreateFile>.
  1114.  
  1115. =item Security => $pSecurityAttributes
  1116.  
  1117. C<$pSecurityAttributes> should contain a C<SECURITY_ATTRIBUTES> structure
  1118. packed into a string or C<[]> [the default].
  1119.  
  1120. =item Model => $hModelFile
  1121.  
  1122. C<$hModelFile> should contain a handle opened with C<GENERIC_READ>
  1123. access to a model file from which file attributes and extended attributes
  1124. are to be copied.  Or C<$hModelFile> can be C<0> [the default].
  1125.  
  1126. =item Access => $sAccess
  1127.  
  1128. =item Access => $uAccess
  1129.  
  1130. C<$sAccess> should be a string of zero or more characters from
  1131. C<"qrw"> specifying the type of access desired:  "query" or C<0>,
  1132. "read" or C<GENERIC_READ> [the default], or "write" or
  1133. C<GENERIC_WRITE>.
  1134.  
  1135. C<$uAccess> should be an unsigned value containing bits set to
  1136. indicate the type of access desired.  C<GENERIC_READ> is the default.
  1137.  
  1138. =item Create => $sCreate
  1139.  
  1140. =item Create => $uCreate
  1141.  
  1142. C<$sCreate> should be a string constaing zero or one character from
  1143. C<"ktn"> and zero or one character from C<"ce">.  These stand for
  1144. "Keep if exists", "Truncate if exists", "New file only", "Create if
  1145. none", and "Existing file only".  These are translated into a
  1146. C<$uCreate> value.
  1147.  
  1148. C<$uCreate> should be one of C<OPEN_ALWAYS>, C<OPEN_EXISTING>,
  1149. C<TRUNCATE_EXISTING>, C<CREATE_ALWAYS>, or C<CREATE_NEW>.
  1150.  
  1151. =item Share => $sShare
  1152.  
  1153. =item Share => $uShare
  1154.  
  1155. C<$sShare> should be a string with zero or more characters from
  1156. C<"rwd"> that is translated into a C<$uShare> value.  C<"rw"> is
  1157. the default.
  1158.  
  1159. C<$uShare> should be an unsigned value having zero or more of the
  1160. following bits set:  C<FILE_SHARE_READ>, C<FILE_SHARE_WRITE>, and
  1161. C<FILE_SHARE_DELETE>.  C<FILE_SHARE_READ|FILE_SHARE_WRITE> is the
  1162. default.
  1163.  
  1164. =back
  1165.  
  1166. Examples:
  1167.  
  1168.     $hFlop= createFile( "//./A:", "r", "r" )
  1169.       or  die "Can't prevent others from writing to floppy: $^E\n";
  1170.     $hDisk= createFile( "//./C:", "rw ke", "" )
  1171.       or  die "Can't get exclusive access to C: $^E\n";
  1172.     $hDisk= createFile( $sFilePath, "ke",
  1173.       { Access=>FILE_READ_ATTRIBUTES } )
  1174.       or  die "Can't read attributes of $sFilePath: $^E\n";
  1175.     $hTemp= createFile( "$ENV{Temp}/temp.$$", "wn", "",
  1176.       { Attributes=>"hst", Flags=>FILE_FLAG_DELETE_ON_CLOSE() } )
  1177.       or  die "Can't create temporary file, temp.$$: $^E\n";
  1178.  
  1179. =item getLogicalDrives
  1180.  
  1181. =item C<@roots= getLogicalDrives()>
  1182.  
  1183. Returns the paths to the root directories of all logical drives
  1184. currently defined.  This includes all types of drive lettters, such
  1185. as floppies, CD-ROMs, hard disks, and network shares.  A typical
  1186. return value on a poorly equipped computer would be C<("A:\\","C:\\")>.
  1187.  
  1188. =item CloseHandle
  1189.  
  1190. =item C<CloseHandle( $hObject )>
  1191.  
  1192. Closes a Win32 native handle, such as one opened via C<CreateFile>. 
  1193. Like most routines, returns a true value if successful and a false
  1194. value [and sets C<$^E> and C<regLastError()>] on failure.
  1195.  
  1196. =item CopyFile
  1197.  
  1198. =item C<CopyFile( $sOldFileName, $sNewFileName, $bFailIfExists )>
  1199.  
  1200. C<$sOldFileName> is the path to the file to be copied. 
  1201. C<$sNewFileName> is the path to where the file should be copied. 
  1202. Note that you can B<NOT> just specify a path to a directory in
  1203. C<$sNewFileName> to copy the file to that directory using the
  1204. same file name.
  1205.  
  1206. If C<$bFailIfExists> is true and C<$sNewFileName> is the path to
  1207. a file that already exists, then C<CopyFile> will fail.  If
  1208. C<$bFailIfExists> is falsea, then the copy of the C<$sOldFileNmae>
  1209. file will overwrite the C<$sNewFileName> file if it already exists.
  1210.  
  1211. Like most routines, returns a true value if successful and a false
  1212. value [and sets C<$^E> and C<regLastError()>] on failure.
  1213.  
  1214. =item CreateFile
  1215.  
  1216. =item C<$hObject= CreateFile( $sPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )>
  1217.  
  1218. On failure, C<$hObject> gets set to a false value and C<$^E> and
  1219. C<fileLastError()> are set to the reason for the failure.  Otherwise,
  1220. C<$hObject> gets set to a Win32 native file handle which is always a
  1221. true value [returns C<"0 but true"> in the impossible(?) case of the
  1222. handle having a value of C<0>].
  1223.  
  1224. C<$sPath> is the path to the file [or device, etc.] to be opened.
  1225.  
  1226. C<$sPath> can use C<"/"> or C<"\\"> as path delimiters and can even
  1227. mix the two.  We will usually only use C<"/"> in our examples since
  1228. using C<"\\"> is usually harder to read.
  1229.  
  1230. Under Windows NT, C<$sPath> can start with C<"//?/"> to allow the use
  1231. of paths longer than C<MAX_PATH> [for UNC paths, replace the leading
  1232. C<"//"> with C<"//?/UNC/">, as in C<"//?/UNC/Server/Share/Dir/File.Ext">].
  1233.  
  1234. C<$sPath> can start with C<"//./"> to indicate that the rest of the
  1235. path is the name of a "DOS device."  You can use C<QueryDosDevice>
  1236. to list all current DOS devices and can add or delete them with
  1237. C<DefineDosDevice>.  If you get the source-code distribution of this
  1238. module from CPAN, then it includes an example script, F<ex/ListDevs.plx>
  1239. that will list all current DOS devices and their "native" definition.
  1240. Again, note that this doesn't work under Win95 nor Win98.
  1241.  
  1242. The most common such DOS devices include:
  1243.  
  1244. =over
  1245.  
  1246. =item C<"//./PhysicalDrive0">
  1247.  
  1248. Your entire first hard disk.  Doesn't work under Windows 95.  This
  1249. allows you to read or write raw sectors of your hard disk and to use
  1250. C<DeviceIoControl> to perform miscellaneous queries and operations
  1251. to the hard disk.   Writing raw sectors and certain other operations
  1252. can seriously damage your files or the function of your computer.
  1253.  
  1254. Locking this for exclusive access [by specifying C<0> for C<$uShare>]
  1255. doesn't prevent access to the partitions on the disk nor their file
  1256. systems.  So other processes can still access any raw sectors within
  1257. a partition and can use the file system on the disk as usual.
  1258.  
  1259. =item C<"//./C:">
  1260.  
  1261. Your F<C:> partition.  Doesn't work under Windows 95.  This allows
  1262. you to read or write raw sectors of that partition and to use
  1263. C<DeviceIoControl> to perform miscellaneous queries and operations
  1264. to the partition.  Writing raw sectors and certain other operations
  1265. can seriously damage your files or the function of your computer.
  1266.  
  1267. Locking this for exclusive access doesn't prevent access to the
  1268. physical drive that the partition is on so other processes can
  1269. still access the raw sectors that way.  Locking this for exclusive
  1270. access B<does> prevent other processes from opening the same raw
  1271. partition and B<does> prevent access to the file system on it.  It
  1272. even prevents the current process from accessing the file system
  1273. on that partition.
  1274.  
  1275. =item C<"//./A:">
  1276.  
  1277. The raw floppy disk.  Doesn't work under Windows 95.  This allows
  1278. you to read or write raw sectors of the floppy disk and to use
  1279. C<DeviceIoControl> to perform miscellaneous queries and operations
  1280. to the floopy disk or drive.
  1281.  
  1282. Locking this for exclusive access prevents all access to the floppy.
  1283.  
  1284. =item C<"//./PIPE/PipeName">
  1285.  
  1286. A named pipe, created via C<CreateNamedPipe>.
  1287.  
  1288. =back
  1289.  
  1290. C<$uAccess> is an unsigned value with bits set indicating the
  1291. type of access desired.  Usually either C<0> ["query" access],
  1292. C<GENERIC_READ>, C<GENERIC_WRITE>, C<GENERIC_READ|GENERIC_WRITE>,
  1293. or C<GENERIC_ALL>.  More specific types of access can be specified,
  1294. such as C<FILE_APPEND_DATA> or C<FILE_READ_EA>.
  1295.  
  1296. C<$uShare> controls how the file is shared, that is, whether other
  1297. processes can have read, write, and/or delete access to the file while
  1298. we have it opened.  C<$uShare> is an unsigned value with zero or more
  1299. of these bits set:  C<FILE_SHARE_READ>, C<FILE_SHARE_WRITE>, and
  1300. C<FILE_SHARE_DELETE>.
  1301.  
  1302. If another process currently has read, write, and/or delete access to
  1303. the file and you don't allow that level of sharing, then your call to
  1304. C<CreateFile> will fail.  If you requested read, write, and/or delete
  1305. access and another process already has the file open but doesn't allow
  1306. that level of sharing, thenn your call to C<createFile> will fail.  Once
  1307. you have the file open, if another process tries to open it with read,
  1308. write, and/or delete access and you don't allow that level of sharing,
  1309. then that process won't be allowed to open the file.
  1310.  
  1311. C<$pSecAttr> should either be C<[]> [for C<NULL>] or a
  1312. C<SECURITY_ATTRIBUTES> data structure packed into a string.
  1313. For example, if C<$pSecDesc> contains a C<SECURITY_DESCRIPTOR>
  1314. structure packed into a string, perhaps via:
  1315.  
  1316.     RegGetKeySecurity( $key, 4, $pSecDesc, 1024 );
  1317.  
  1318. then you can set C<$pSecAttr> via:
  1319.  
  1320.     $pSecAttr= pack( "L P i", 12, $pSecDesc, $bInheritHandle );
  1321.  
  1322. C<$uCreate> is one of the following values:  C<OPEN_ALWAYS>,
  1323. C<OPEN_EXISTING>, C<TRUNCATE_EXISTING>, C<CREATE_ALWAYS>, and
  1324. C<CREATE_NEW>.
  1325.  
  1326. C<$uFlags> is an unsigned value with zero or more bits set indicating
  1327. attributes to associate with the file [C<FILE_ATTRIBUTE_*> values] or
  1328. special options [C<FILE_FLAG_*> values].
  1329.  
  1330. If opening the client side of a named pipe, then you can also set
  1331. C<$uFlags> to include C<SECURITY_SQOS_PRESENT> along with one of the
  1332. other C<SECURITY_*> constants to specify the security quality of
  1333. service to be used.
  1334.  
  1335. C<$hModel> is C<0> [or C<[]>, both of which mean C<NULL>] or a Win32
  1336. native handle opened with C<GENERIC_READ> access to a model file from
  1337. which file attributes and extended attributes are to be copied if a
  1338. new file gets created.
  1339.  
  1340. Examples:
  1341.  
  1342.     $hFlop= CreateFile( "//./A:", GENERIC_READ(),
  1343.       FILE_SHARE_READ(), [], OPEN_EXISTING(), 0, [] )
  1344.       or  die "Can't prevent others from writing to floppy: $^E\n";
  1345.     $hDisk= createFile( $sFilePath, FILE_READ_ATTRIBUTES(),
  1346.       FILE_SHARE_READ()|FILE_SHARE_WRITE(), [], OPEN_EXISTING(), 0, [] )
  1347.       or  die "Can't read attributes of $sFilePath: $^E\n";
  1348.     $hTemp= createFile( "$ENV{Temp}/temp.$$", GENERIC_WRITE(), 0,
  1349.       CREATE_NEW(), FILE_FLAG_DELETE_ON_CLOSE()|attrLetsToBits("hst"), [] )
  1350.       or  die "Can't create temporary file, temp.$$: $^E\n";
  1351.  
  1352. =item DefineDosDevice
  1353.  
  1354. =item C<DefineDosDevice( $uFlags, $sDosDeviceName, $sTargetPath )>
  1355.  
  1356. Defines a new DOS device, overrides the current definition of a DOS
  1357. device, or deletes a definition of a DOS device.  Like most routines,
  1358. returns a true value if successful and a false value [and sets C<$^E>
  1359. and C<regLastError()>] on failure.
  1360.  
  1361. C<$sDosDeviceName> is the name of a DOS device for which we'd like
  1362. to add or delete a definition.
  1363.  
  1364. C<$uFlags> is an unsigned value with zero or more of the following
  1365. bits set:
  1366.  
  1367. =over
  1368.  
  1369. =item C<DDD_RAW_TARGET_PATH>
  1370.  
  1371. Indicates that C<$sTargetPath> will be a raw Windows NT object name. 
  1372. This usually means that C<$sTargetPath> starts with C<"\\Device\\">. 
  1373. Note that you cannot use C<"/"> in place of C<"\\"> in raw target path
  1374. names.
  1375.  
  1376. =item C<DDD_REMOVE_DEFINITION>
  1377.  
  1378. Requests that a definition be deleted.  If C<$sTargetPath> is
  1379. C<[]> [for C<NULL>], then the most recently added definition for
  1380. C<$sDosDeviceName> is removed.  Otherwise the most recently added
  1381. definition matching C<$sTargetPath> is removed.
  1382.  
  1383. If the last definition is removed, then the DOS device name is
  1384. also deleted.
  1385.  
  1386. =item C<DDD_EXACT_MATCH_ON_REMOVE>
  1387.  
  1388. When deleting a definition, this bit causes each C<$sTargetPath> to
  1389. be compared to the full-length definition when searching for the most
  1390. recently added match.  If this bit is not set, then C<$sTargetPath>
  1391. only needs to match a prefix of the definition.
  1392.  
  1393. =back
  1394.  
  1395. C<$sTargetPath> is the DOS device's specific definition that you
  1396. wish to add or delete.  For C<DDD_RAW_TARGET_PATH>, these usually
  1397. start with C<"\\Device\\">.  If the C<DDD_RAW_TARGET_PATH> bit is
  1398. not set, then C<$sTargetPath> is just an ordinary path to some file
  1399. or directory, providing the functionality of the B<subst> command.
  1400.  
  1401. =item DeleteFile
  1402.  
  1403. =item C<DeleteFile( $sFileName )>
  1404.  
  1405. Deletes the named file.  Compared to Perl's C<unlink>, C<DeleteFile>
  1406. has the advantage of not deleting read-only files.  For B<some>
  1407. versions of Perl, C<unlink> silently calls C<chmod> whether it needs
  1408. to or not before deleting the file so that files that you have
  1409. protected by marking them as read-only are not always protected from
  1410. Perl's C<unlink>.
  1411.  
  1412. Like most routines, returns a true value if successful and a false
  1413. value [and sets C<$^E> and C<regLastError()>] on failure.
  1414.  
  1415. =item DeviceIoControl
  1416.  
  1417. =item C<DeviceIoControl( $hDevice, $uIoControlCode, $pInBuf, $lInBuf, $opOutBuf, $lOutBuf, $olRetBytes, $pOverlapped )>
  1418.  
  1419. Requests a special operation on an I/O [input/output] device, such
  1420. as ejecting a tape or formatting a disk.  Like most routines, returns
  1421. a true value if successful and a false value [and sets C<$^E> and
  1422. C<regLastError()>] on failure.
  1423.  
  1424. C<$hDevice> is a Win32 native file handle to a device [return value
  1425. from C<CreateFile>].
  1426.  
  1427. C<$uIoControlCode> is an unsigned value [a C<IOCTL_*> constant]
  1428. indicating the type query or other operation to be performed.
  1429.  
  1430. C<$pInBuf> is C<[]> [for C<NULL>] or a data structure packed into a
  1431. string.  The type of data structure depends on the C<$uIoControlCode>
  1432. value.  C<$lInBuf> is C<0> or the length of the structure in
  1433. C<$pInBuf>.  If C<$pInBuf> is not C<[]> and C<$lInBuf> is C<0>, then
  1434. C<$lInBuf> will automatically be set to C<length($pInBuf)> for you.
  1435.  
  1436. C<$opOutBuf> is C<[]> [for C<NULL>] or will be set to contain a
  1437. returned data structure packed into a string.  C<$lOutBuf> indicates
  1438. how much space to allocate in C<$opOutBuf> for C<DeviceIoControl> to
  1439. store the data structure.  If C<$lOutBuf> is a number and C<$opOutBuf>
  1440. already has a buffer allocated for it that is larger than C<$lOutBuf>
  1441. bytes, then this larger buffer size will be passed to C<DeviceIoControl>.
  1442. However, you can force a specific buffer size to be passed to
  1443. C<DeviceIoControl> by prepending a C<"="> to the front of C<$lOutBuf>.
  1444.  
  1445. C<$olRetBytes> is C<[]> or is a scalar to receive the number of bytes
  1446. written to C<$opOutBuf>.  Even when C<$olRetBytes> is C<[]>, a valid
  1447. pointer to a C<DWORD> [and not C<NULL>] is passed to C<DeviceIoControl>.
  1448. In this case, C<[]> just means that you don't care about the value
  1449. that might be written to C<$olRetBytes>, which is usually the case
  1450. since you can usually use C<length($opOutBuf)> instead.
  1451.  
  1452. C<$pOverlapped> is C<[]> or is a C<OVERLAPPED> structure packed into
  1453. a string.  This is only useful if C<$hDevice> was opened with the
  1454. C<FILE_FLAG_OVERLAPPED> flag set.
  1455.  
  1456. =item FdGetOsFHandle
  1457.  
  1458. =item C<$hNativeHandle= FdGetOsFHandle( $ivFd )>
  1459.  
  1460. C<FdGetOsFHandle> simply calls C<_get_osfhandle()>.  It was renamed
  1461. to better fit in with the rest the function names of this module,
  1462. in particular to distinguish it from C<GetOsFHandle>.  It takes an
  1463. integer file descriptor [as from Perl's C<fileno>] and returns the
  1464. Win32 native file handle associated with that file descriptor or
  1465. C<INVALID_HANDLE_VALUE> if C<$ivFd> is not an open file descriptor.
  1466.  
  1467. When you call Perl's C<open> to set a Perl file handle [like C<STDOUT>],
  1468. Perl calls C's C<fopen> to set a stdio C<FILE *>.  C's C<fopen> calls
  1469. something like Unix's C<open>, that is, Win32's C<_sopen>, to get an
  1470. integer file descriptor [where 0 is for C<STDIN>, 1 for C<STDOUT>, etc.].
  1471. Win32's C<_sopen> calls C<CreateFile> to set a C<HANDLE>, a Win32 native
  1472. file handle.  So every Perl file handle [like C<STDOUT>] has an integer
  1473. file descriptor associated with it that you can get via C<fileno>.  And,
  1474. under Win32, every file descriptor has a Win32 native file handle
  1475. associated with it.  C<FdGetOsFHandle> lets you get access to that.
  1476.  
  1477. C<$hNativeHandle> is set to C<INVALID_HANDLE_VALUE> [and
  1478. C<lastFileError()> and C<$^E> are set] if C<FdGetOsFHandle> fails. 
  1479. See also C<GetOsFHandle> which provides a friendlier interface.
  1480.  
  1481. =item fileConstant
  1482.  
  1483. =item C<$value= fileConstant( $sConstantName )>
  1484.  
  1485. Fetch the value of a constant.  Returns C<undef> if C<$sConstantName>
  1486. is not the name of a constant supported by this module.  Never sets
  1487. C<$!> nor C<$^E>.
  1488.  
  1489. This function is rarely used since you will usually get the value of a
  1490. constant by having that constant imported into your package by listing
  1491. the constant name in the C<use Win32API::File> statement and then
  1492. simply using the constant name in your code [perhaps followed by
  1493. C<()>].  This function is useful for verifying constant names not in
  1494. Perl code, for example, after prompting a user to type in a constant
  1495. name.
  1496.  
  1497. =item fileLastError
  1498.  
  1499. =item C<$svError= fileLastError();>
  1500.  
  1501. =item C<fileLastError( $uError );>
  1502.  
  1503. Returns the last error encountered by a routine from this module. 
  1504. It is just like C<$^E> except it isn't changed by anything except
  1505. routines from this module.  Ideally you could just use C<$^E>, but
  1506. current versions of Perl often overwrite C<$^E> before you get a
  1507. chance to check it and really old versions of Perl don't really
  1508. support C<$^E> under Win32.
  1509.  
  1510. Just like C<$^E>, in a numeric context C<fileLastError()> returns
  1511. the numeric error value while in a string context it returns a
  1512. text description of the error [actually it returns a Perl scalar
  1513. that contains both values so C<$x= fileLastError()> causes C<$x>
  1514. to give different values in string vs. numeric contexts].  On old
  1515. versions of Perl where C<$^E> isn't tied to C<GetLastError()>,
  1516. C<fileLastError> simply returns the number of the error and you'll
  1517. need to use <Win32::FormatMessage> to get the error string.
  1518.  
  1519. The last form sets the error returned by future calls to
  1520. C<fileLastError()> and should not be used often.  C<$uError> must
  1521. be a numeric error code.  Also returns the dual-valued version
  1522. of C<$uError>.
  1523.  
  1524. =item GetDriveType
  1525.  
  1526. =item C<$uDriveType= GetDriveType( $sRootPath )>
  1527.  
  1528. Takes a string giving the path to the root directory of a file system
  1529. [called a "drive" because every file system is assigned a "drive letter"]
  1530. and returns an unsigned value indicating the type of drive the file
  1531. system is on.  The return value should be one of:
  1532.  
  1533. =over
  1534.  
  1535. =item C<DRIVE_UNKNOWN>
  1536.  
  1537. None of the following.
  1538.  
  1539. =item C<DRIVE_NO_ROOT_DIR>
  1540.  
  1541. A "drive" that does not have a file system.  This can be a drive letter
  1542. that hasn't been defined or a drive letter assigned to a partition
  1543. that hasn't been formatted yet.
  1544.  
  1545. =item C<DRIVE_REMOVABLE>
  1546.  
  1547. A floppy diskette drive or other removable media drive, but not a CD-ROM
  1548. drive.
  1549.  
  1550. =item C<DRIVE_FIXED>
  1551.  
  1552. An ordinary hard disk partition.
  1553.  
  1554. =item C<DRIVE_REMOTE>
  1555.  
  1556. A network share.
  1557.  
  1558. =item C<DRIVE_CDROM>
  1559.  
  1560. A CD-ROM drive.
  1561.  
  1562. =item C<DRIVE_RAMDISK>
  1563.  
  1564. A "ram disk" or memory-resident virtual file system used for high-speed
  1565. access to small amounts of temporary file space.
  1566.  
  1567. =back
  1568.  
  1569. =item GetFileType
  1570.  
  1571. =item C<$uFileType= GetFileType( $hFile )>
  1572.  
  1573. Takes a Win32 native file handle and returns a C<FILE_TYPE_*> constant
  1574. indicating the type of the file opened on that handle:
  1575.  
  1576. =over
  1577.  
  1578. =item C<FILE_TYPE_UNKNOWN>
  1579.  
  1580. None of the below.  Often a special device.
  1581.  
  1582. =item C<FILE_TYPE_DISK>
  1583.  
  1584. An ordinary disk file.
  1585.  
  1586. =item C<FILE_TYPE_CHAR>
  1587.  
  1588. What Unix would call a "character special file", that is, a device that
  1589. works on character streams such as a printer port or a console.
  1590.  
  1591. =item C<FILE_TYPE_PIPE>
  1592.  
  1593. Either a named or anonymous pipe.
  1594.  
  1595. =back
  1596.  
  1597. =item getFileSize
  1598.  
  1599. =item C<$size= getFileSize( $hFile )>
  1600.  
  1601. This is a Perl-friendly wrapper for the C<GetFileSize> (below) API call.
  1602.  
  1603. It takes a Win32 native file handle and returns the size in bytes. Since the
  1604. size can be a 64 bit value, on non 64 bit integer Perls the value returned will
  1605. be an object of type C<Math::BigInt>.
  1606.  
  1607. =item GetFileSize
  1608.  
  1609. =item C<$iSizeLow= GetFileSize($win32Handle, $iSizeHigh)>
  1610.  
  1611. Returns the size of a file pointed to by C<$win32Handle>, optionally storing
  1612. the high order 32 bits into C<$iSizeHigh> if it is not C<[]>. If $iSizeHigh is
  1613. C<[]>, a non-zero value indicates success. Otherwise, on failure the return
  1614. value will be C<0xffffffff> and C<fileLastError()> will not be C<NO_ERROR>.
  1615.  
  1616. =item GetOverlappedResult
  1617.  
  1618. =item C<$bRetval= GetOverlappedResult( $win32Handle, $pOverlapped,
  1619.  $numBytesTransferred, $bWait )>
  1620.  
  1621. Used for asynchronous IO in Win32 to get the result of a pending IO operation,
  1622. such as when a file operation returns C<ERROR_IO_PENDING>. Returns a false
  1623. value on failure. The C<$overlapped> structure and C<$numBytesTransferred>
  1624. will be modified with the results of the operation.
  1625.  
  1626. As far as creating the C<$pOverlapped> structure, you are currently on your own.
  1627.  
  1628. See L<http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getoverlappedresult.asp> for more information.
  1629.  
  1630. =item GetLogicalDrives
  1631.  
  1632. =item C<$uDriveBits= GetLogicalDrives()>
  1633.  
  1634. Returns an unsigned value with one bit set for each drive letter currently
  1635. defined.  If "A:" is currently a valid drive letter, then the C<1> bit
  1636. will be set in C<$uDriveBits>.  If "B:" is valid, then the C<2> bit will
  1637. be set.  If "Z:" is valid, then the C<2**26> [C<0x4000000>] bit will be
  1638. set.
  1639.  
  1640. =item GetLogicalDriveStrings
  1641.  
  1642. =item C<$olOutLength= GetLogicalDriveStrings( $lBufSize, $osBuffer )>
  1643.  
  1644. For each currently defined drive letter, a C<'\0'>-terminated string
  1645. of the path to the root of its file system is constructed.  All of
  1646. these strings are concatenated into a single larger string and an
  1647. extra terminating C<'\0'> is added.  This larger string is returned
  1648. in C<$osBuffer>.  Note that this includes drive letters that have
  1649. been defined but that have no file system, such as drive letters
  1650. assigned to unformatted partitions.
  1651.  
  1652. C<$lBufSize> is the size of the buffer to allocate to store this
  1653. list of strings.  C<26*4+1> is always sufficient and should usually
  1654. be used.
  1655.  
  1656. C<$osBuffer> is a scalar to be set to contain the constructed string.
  1657.  
  1658. C<$olOutLength> is the number of bytes actually written to C<$osBuffer>
  1659. but C<length($osBuffer)> can also be used to determine this.
  1660.  
  1661. For example, on a poorly equipped computer,
  1662.  
  1663.     GetLogicalDriveStrings( 4*26+1, $osBuffer );
  1664.  
  1665. might set C<$osBuffer> to the 9-character string, C<"A:\\\0C:\\\0\0">.
  1666.  
  1667. =item GetHandleInformation
  1668.  
  1669. =item C<GetHandleInformation( $hObject, $ouFlags )>
  1670.  
  1671. Retrieves the flags associated with a Win32 native file handle or object
  1672. handle.
  1673.  
  1674. C<$hObject> is an open Win32 native file handle or an open Win32 native
  1675. handle to some other type of object.
  1676.  
  1677. C<$ouFlags> will be set to an unsigned value having zero or more of
  1678. the bits C<HANDLE_FLAG_INHERIT> and C<HANDLE_FLAG_PROTECT_FROM_CLOSE>
  1679. set.  See the C<":HANDLE_FLAG_"> export class for the meanings of these
  1680. bits.
  1681.  
  1682. =item GetOsFHandle
  1683.  
  1684. =item C<$hNativeHandle= GetOsFHandle( FILE )>
  1685.  
  1686. Takes a Perl file handle [like C<STDIN>] and returns the Win32 native
  1687. file handle associated with it.  See C<FdGetOsFHandle> for more
  1688. information about Win32 native file handles.
  1689.  
  1690. C<$hNativeHandle> is set to a false value [and C<lastFileError()> and
  1691. C<$^E> are set] if C<GetOsFHandle> fails.    C<GetOsFHandle> returns
  1692. C<"0 but true"> in the impossible(?) case of the handle having a value
  1693. of C<0>.
  1694.  
  1695. =item GetVolumeInformation
  1696.  
  1697. =item C<GetVolumeInformation( $sRootPath, $osVolName, $lVolName, $ouSerialNum, $ouMaxNameLen, $ouFsFlags, $osFsType, $lFsType )>
  1698.  
  1699. Gets information about a file system volume, returning a true
  1700. value if successful.  On failure, returns a false value and sets
  1701. C<fileLastError()> and C<$^E>.
  1702.  
  1703. C<$sRootPath> is a string specifying the path to the root of the file system,
  1704. for example, C<"C:/">.
  1705.  
  1706. C<$osVolName> is a scalar to be set to the string representing the
  1707. volume name, also called the file system label.  C<$lVolName> is the
  1708. number of bytes to allocate for the C<$osVolName> buffer [see
  1709. L<Buffer Sizes> for more information].
  1710.  
  1711. C<$ouSerialNum> is C<[]> [for C<NULL>] or will be set to the numeric
  1712. value of the volume's serial number.
  1713.  
  1714. C<$ouMaxNameLen> is C<[]> [for C<NULL>] or will be set to the maximum
  1715. length allowed for a file name or directory name within the file system.
  1716.  
  1717. C<$osFsType> is a scalar to be set to the string representing the
  1718. file system type, such as C<"FAT"> or C<"NTFS">.  C<$lFsType> is the
  1719. number of bytes to allocate for the C<$osFsType> buffer [see
  1720. L<Buffer Sizes> for more information].
  1721.  
  1722. C<$ouFsFlags> is C<[]> [for C<NULL>] or will be set to an unsigned integer
  1723. with bits set indicating properties of the file system:
  1724.  
  1725. =over
  1726.  
  1727. =item C<FS_CASE_IS_PRESERVED>
  1728.  
  1729. The file system preserves the case of file names [usually true].
  1730. That is, it doesn't change the case of file names such as forcing
  1731. them to upper- or lower-case.
  1732.  
  1733. =item C<FS_CASE_SENSITIVE>
  1734.  
  1735. The file system supports the ability to not ignore the case of file
  1736. names [but might ignore case the way you are using it].  That is, the
  1737. file system has the ability to force you to get the letter case of a
  1738. file's name exactly right to be able to open it.  This is true for
  1739. "NTFS" file systems, even though case in file names is usually still
  1740. ignored.
  1741.  
  1742. =item C<FS_UNICODE_STORED_ON_DISK>
  1743.  
  1744. The file system preserves Unicode in file names [true for "NTFS"].
  1745.  
  1746. =item C<FS_PERSISTENT_ACLS>
  1747.  
  1748. The file system supports setting Access Control Lists on files [true
  1749. for "NTFS"].
  1750.  
  1751. =item C<FS_FILE_COMPRESSION>
  1752.  
  1753. The file system supports compression on a per-file basis [true for
  1754. "NTFS"].
  1755.  
  1756. =item C<FS_VOL_IS_COMPRESSED>
  1757.  
  1758. The entire file system is compressed such as via "DoubleSpace".
  1759.  
  1760. =back
  1761.  
  1762. =item IsRecognizedPartition
  1763.  
  1764. =item C<IsRecognizedPartition( $ivPartitionType )>
  1765.  
  1766. Takes a partition type and returns whether that partition type is
  1767. supported under Win32.  C<$ivPartitonType> is an integer value as from
  1768. the operating system byte of a hard disk's DOS-compatible partition
  1769. table [that is, a partition table for x86-based Win32, not, for
  1770. example, one used with Windows NT for Alpha processors].  For example,
  1771. the C<PartitionType> member of the C<PARTITION_INFORMATION> structure.
  1772.  
  1773. Common values for C<$ivPartitionType> include C<PARTITION_FAT_12==1>,
  1774. C<PARTITION_FAT_16==4>, C<PARTITION_EXTENDED==5>, C<PARTITION_FAT32==0xB>.
  1775.  
  1776. =item IsContainerPartition
  1777.  
  1778. =item C<IsContainerPartition( $ivPartitionType )>
  1779.  
  1780. Takes a partition type and returns whether that partition is a
  1781. "container" partition that is supported under Win32, that is, whether
  1782. it is an "extended" partition that can contain "logical" partitions. 
  1783. C<$ivPartitonType> is as for C<IsRecognizedPartition>.
  1784.  
  1785. =item MoveFile
  1786.  
  1787. =item C<MoveFile( $sOldName, $sNewName )>
  1788.  
  1789. Renames a file or directory.  C<$sOldName> is the name of the existing
  1790. file or directory that is to be renamed.  C<$sNewName> is the new name
  1791. to give the file or directory.  Returns a true value if the move
  1792. succeeds.  For failure, returns a false value and sets
  1793. C<fileLastErorr()> and C<$^E> to the reason for the failure.
  1794.  
  1795. Files can be "renamed" between file systems and the file contents and
  1796. some attributes will be moved.  Directories can only be renamed within
  1797. one file system.  If there is already a file or directory named
  1798. C<$sNewName>, then C<MoveFile> will fail.
  1799.  
  1800. =item MoveFileEx
  1801.  
  1802. =item C<MoveFileEx( $sOldName, $sNewName, $uFlags )>
  1803.  
  1804. Renames a file or directory.  C<$sOldName> is the name of the existing
  1805. file or directory that is to be renamed.  C<$sNewName> is the new name
  1806. to give the file or directory.  Returns a true value if the move
  1807. succeeds.  For failure, returns a false value and sets
  1808. C<fileLastErorr()> and C<$^E> to the reason for the failure.
  1809.  
  1810. C<$uFlags> is an unsigned value with zero or more of the following bits set:
  1811.  
  1812. =over
  1813.  
  1814. =item C<MOVEFILE_REPLACE_EXISTING>
  1815.  
  1816. If this bit is set and a file [but not a directory] named C<$sNewName>
  1817. already exists, then it will be replaced by C<$sOldName>.  If this bit
  1818. is not set then C<MoveFileEx> will fail rather than replace an existing
  1819. C<$sNewName>.
  1820.  
  1821. =item C<MOVEFILE_COPY_ALLOWED>
  1822.  
  1823. Allows files [but not directories] to be moved between file systems
  1824. by copying the C<$sOldName> file data and some attributes to
  1825. C<$sNewName> and then deleting C<$sOldName>.  If this bit is not set
  1826. [or if C<$sOldName> denotes a directory] and C<$sNewName> refers to a
  1827. different file system than C<$sOldName>, then C<MoveFileEx> will fail.
  1828.  
  1829. =item C<MOVEFILE_DELAY_UNTIL_REBOOT>
  1830.  
  1831. Preliminary verifications are made and then an entry is added to the
  1832. Registry to cause the rename [or delete] operation to be done the
  1833. next time this copy of the operating system is booted [right after
  1834. any automatic file system checks have completed].  This is not
  1835. supported under Windows 95.
  1836.  
  1837. When this bit is set, C<$sNewName> can be C<[]> [for C<NULL>] to
  1838. indicate that C<$sOldName> should be deleted during the next boot
  1839. rather than renamed.
  1840.  
  1841. Setting both the C<MOVEFILE_COPY_ALLOWED> and
  1842. C<MOVEFILE_DELAY_UNTIL_REBOOT> bits will cause C<MoveFileEx> to fail.
  1843.  
  1844. =item C<MOVEFILE_WRITE_THROUGH>
  1845.  
  1846. Ensures that C<MoveFileEx> won't return until the operation has
  1847. finished and been flushed to disk.   This is not supported under
  1848. Windows 95.  Only affects file renames to another file system,
  1849. forcing a buffer flush at the end of the copy operation.
  1850.  
  1851. =back
  1852.  
  1853. =item OsFHandleOpen
  1854.  
  1855. =item C<OsFHandleOpen( FILE, $hNativeHandle, $sMode )>
  1856.  
  1857. Opens a Perl file handle based on an already open Win32 native
  1858. file handle [much like C's C<fdopen()> does with a file descriptor].
  1859. Returns a true value if the open operation succeeded.  For failure,
  1860. returns a false value and sets C<$!> [and possibly C<fileLastError()>
  1861. and C<$^E>] to the reason for the failure.
  1862.  
  1863. C<FILE> is a Perl file handle [in any of the supported forms, a
  1864. bareword, a string, a typeglob, or a reference to a typeglob] that
  1865. will be opened.  If C<FILE> is already open, it will automatically
  1866. be closed before it is reopened.
  1867.  
  1868. C<$hNativeHandle> is an open Win32 native file handle, probably the
  1869. return value from C<CreateFile> or C<createFile>.
  1870.  
  1871. C<$sMode> is string of zero or more letters from C<"rwatb">.  These
  1872. are translated into a combination C<O_RDONLY> [C<"r">], C<O_WRONLY>
  1873. [C<"w">], C<O_RDWR> [C<"rw">], C<O_APPEND> [C<"a">], C<O_TEXT>
  1874. [C<"t">], and C<O_BINARY> [C<"b">] flags [see the L<Fcntl> module]
  1875. that is passed to C<OsFHandleOpenFd>.   Currently only C<O_APPEND>
  1876. and C<O_TEXT> have any significance.
  1877.  
  1878. Also, a C<"r"> and/or C<"w"> in C<$sMode> is used to decide how the
  1879. file descriptor is converted into a Perl file handle, even though this
  1880. doesn't appear to make a difference.  One of the following is used:
  1881.  
  1882.     open( FILE, "<&=".$ivFd )    # "r" w/o "w"
  1883.     open( FILE, ">&=".$ivFd )    # "w" w/o "r"
  1884.     open( FILE, "+<&=".$ivFd )    # both "r" and "w"
  1885.  
  1886. C<OsFHandleOpen> eventually calls the Win32-specific C routine
  1887. C<_open_osfhandle()> or Perl's "improved" version called
  1888. C<win32_open_osfhandle()>.  Prior to Perl5.005, C's
  1889. C<_open_osfhandle()> is called which will fail if
  1890. C<GetFileType($hNativeHandle)> would return C<FILE_TYPE_UNKNOWN>.  For
  1891. Perl5.005 and later, C<OsFHandleOpen> calls C<win32_open_osfhandle()>
  1892. from the Perl DLL which doesn't have this restriction.
  1893.  
  1894. =item OsFHandleOpenFd
  1895.  
  1896. =item C<$ivFD= OsFHandleOpenFd( $hNativeHandle, $uMode )>
  1897.  
  1898. Opens a file descriptor [C<$ivFD>] based on an already open Win32
  1899. native file handle, C<$hNativeHandle>.  This just calls the
  1900. Win32-specific C routine C<_open_osfhandle()> or Perl's "improved"
  1901. version called C<win32_open_osfhandle()>.  Prior to Perl5.005 and in Cygwin
  1902. Perl, C's C<_open_osfhandle()> is called which will fail if
  1903. C<GetFileType($hNativeHandle)> would return C<FILE_TYPE_UNKNOWN>.  For
  1904. Perl5.005 and later, C<OsFHandleOpenFd> calls C<win32_open_osfhandle()> from
  1905. the Perl DLL which doesn't have this restriction.
  1906.  
  1907. C<$uMode> the logical combination of zero or more C<O_*> constants
  1908. exported by the C<Fcntl> module.  Currently only C<O_APPEND> and
  1909. C<O_TEXT> have any significance.
  1910.  
  1911. C<$ivFD> will be non-negative if the open operation was successful. 
  1912. For failure, C<-1> is returned and C<$!> [and possibly
  1913. C<fileLastError()> and C<$^E>] is set to the reason for the failure.
  1914.  
  1915. =item QueryDosDevice
  1916.  
  1917. =item C<$olTargetLen= QueryDosDevice( $sDosDeviceName, $osTargetPath, $lTargetBuf )>
  1918.  
  1919. Looks up the definition of a given "DOS" device name, yielding the
  1920. active Windows NT native device name along with any currently dormant
  1921. definitions.
  1922.  
  1923. C<$sDosDeviceName> is the name of the "DOS" device whose definitions
  1924. we want.  For example, C<"C:">, C<"COM1">, or C<"PhysicalDrive0">.
  1925. If C<$sDosDeviceName> is C<[]> [for C<NULL>], the list of all DOS
  1926. device names is returned instead.
  1927.  
  1928. C<$osTargetPath> will be assigned a string containing the list of
  1929. definitions.  The definitions are each C<'\0'>-terminate and are
  1930. concatenated into the string, most recent first, with an extra C<'\0'>
  1931. at the end of the whole string [see C<GetLogicalDriveStrings> for
  1932. a sample of this format].
  1933.  
  1934. C<$lTargetBuf> is the size [in bytes] of the buffer to allocate for
  1935. C<$osTargetPath>.  See L<Buffer Sizes> for more information.
  1936.  
  1937. C<$olTargetLen> is set to the number of bytes written to
  1938. C<$osTargetPath> but you can also use C<length($osTargetPath)>
  1939. to determine this.
  1940.  
  1941. For failure, C<0> is returned and C<fileLastError()> and C<$^E> are
  1942. set to the reason for the failure.
  1943.  
  1944. =item ReadFile
  1945.  
  1946. =item C<ReadFile( $hFile, $opBuffer, $lBytes, $olBytesRead, $pOverlapped )>
  1947.  
  1948. Reads bytes from a file or file-like device.  Returns a true value if
  1949. the read operation was successful.  For failure, returns a false value
  1950. and sets C<fileLastError()> and C<$^E> for the reason for the failure.
  1951.  
  1952. C<$hFile> is a Win32 native file handle that is already open to the
  1953. file or device to read from.
  1954.  
  1955. C<$opBuffer> will be set to a string containing the bytes read.
  1956.  
  1957. C<$lBytes> is the number of bytes you would like to read. 
  1958. C<$opBuffer> is automatically initialized to have a buffer large
  1959. enough to hold that many bytes.  Unlike other buffer sizes, C<$lBytes>
  1960. does not need to have a C<"="> prepended to it to prevent a larger
  1961. value to be passed to the underlying Win32 C<ReadFile> API.  However,
  1962. a leading C<"="> will be silently ignored, even if Perl warnings are
  1963. enabled.
  1964.  
  1965. If C<$olBytesRead> is not C<[]>, it will be set to the actual number
  1966. of bytes read, though C<length($opBuffer)> can also be used to
  1967. determine this.
  1968.  
  1969. C<$pOverlapped> is C<[]> or is a C<OVERLAPPED> structure packed
  1970. into a string.  This is only useful if C<$hFile> was opened with
  1971. the C<FILE_FLAG_OVERLAPPED> flag set.
  1972.  
  1973. =item SetErrorMode
  1974.  
  1975. =item C<$uOldMode= SetErrorMode( $uNewMode )>
  1976.  
  1977. Sets the mode controlling system error handling B<and> returns the
  1978. previous mode value.  Both C<$uOldMode> and C<$uNewMode> will have
  1979. zero or more of the following bits set:
  1980.  
  1981. =over
  1982.  
  1983. =item C<SEM_FAILCRITICALERRORS>
  1984.  
  1985. If set, indicates that when a critical error is encountered, the call
  1986. that triggered the error fails immediately.  Normally this bit is not
  1987. set, which means that a critical error causes a dialogue box to appear
  1988. notifying the desktop user that some application has triggered a
  1989. critical error.   The dialogue box allows the desktop user to decide
  1990. whether the critical error is returned to the process, is ignored, or
  1991. the offending operation is retried.
  1992.  
  1993. This affects the C<CreateFile> and C<GetVolumeInformation> calls.
  1994.  
  1995. Setting this bit is useful for allowing you to check whether a floppy
  1996. diskette is in the floppy drive.
  1997.  
  1998. =item C<SEM_NOALIGNMENTFAULTEXCEPT>
  1999.  
  2000. If set, this causes memory access misalignment faults to be
  2001. automatically fixed in a manner invisible to the process.  This flag
  2002. is ignored on x86-based versions of Windows NT.  This flag is not
  2003. supported on Windows 95.
  2004.  
  2005. =item C<SEM_NOGPFAULTERRORBOX>
  2006.  
  2007. If set, general protection faults do not generate a dialogue box but
  2008. can instead be handled by the process via an exception handler.  This
  2009. bit should not be set by programs that don't know how to handle such
  2010. faults.
  2011.  
  2012. =item C<SEM_NOOPENFILEERRORBOX>
  2013.  
  2014. If set, then when an attempt to continue reading from or writing to
  2015. an already open file [usually on a removable medium like a floppy
  2016. diskette] finds the file no longer available, the call will
  2017. immediately fail.  Normally this bit is not set, which means that
  2018. instead a dialogue box will appear notifying the desktop user that
  2019. some application has run into this problem.   The dialogue box allows
  2020. the desktop user to decide whether the failure is returned to the
  2021. process, is ignored, or the offending operation is retried.
  2022.  
  2023. This affects the C<ReadFile> and C<WriteFile> calls.
  2024.  
  2025. =back
  2026.  
  2027. =item setFilePointer
  2028.  
  2029. =item C<$uNewPos= setFilePointer( $hFile, $ivOffset, $uFromWhere )>
  2030.  
  2031. This is a perl-friendly wrapper for the SetFilePointer API (below).
  2032. C<$ivOffset> can be a 64 bit integer or C<Math::BigInt> object if your Perl
  2033. doesn't have 64 bit integers. The return value is the new offset and will
  2034. likewise be a 64 bit integer or a C<Math::BigInt> object.
  2035.  
  2036. =item SetFilePointer
  2037.  
  2038. =item C<$uNewPos= SetFilePointer( $hFile, $ivOffset, $ioivOffsetHigh, $uFromWhere )>
  2039.  
  2040. The native Win32 version of C<seek()>.  C<SetFilePointer> sets the
  2041. position within a file where the next read or write operation will
  2042. start from.
  2043.  
  2044. C<$hFile> is a Win32 native file handle.
  2045.  
  2046. C<$uFromWhere> is either C<FILE_BEGIN>, C<FILE_CURRENT>, or
  2047. C<FILE_END>, indicating that the new file position is being specified
  2048. relative to the beginning of the file, the current file pointer, or
  2049. the end of the file, respectively.
  2050.  
  2051. C<$ivOffset> is [if C<$ioivOffsetHigh> is C<[]>] the offset [in bytes]
  2052. to the new file position from the position specified via
  2053. C<$uFromWhere>.  If C<$ioivOffsetHigh> is not C<[]>, then C<$ivOffset>
  2054. is converted to an unsigned value to be used as the low-order 4 bytes
  2055. of the offset.
  2056.  
  2057. C<$ioivOffsetHigh> can be C<[]> [for C<NULL>] to indicate that you are
  2058. only specifying a 4-byte offset and the resulting file position will
  2059. be 0xFFFFFFFE or less [just under 4GB].  Otherwise C<$ioivOfffsetHigh>
  2060. starts out with the high-order 4 bytes [signed] of the offset and gets
  2061. set to the [unsigned] high-order 4 bytes of the resulting file position.
  2062.  
  2063. The underlying C<SetFilePointer> returns C<0xFFFFFFFF> to indicate
  2064. failure, but if C<$ioivOffsetHigh> is not C<[]>, you would also have
  2065. to check C<$^E> to determine whether C<0xFFFFFFFF> indicates an error
  2066. or not.  C<Win32API::File::SetFilePointer> does this checking for you
  2067. and returns a false value if and only if the underlying
  2068. C<SetFilePointer> failed.  For this reason, C<$uNewPos> is set to
  2069. C<"0 but true"> if you set the file pointer to the beginning of the
  2070. file [or any position with 0 for the low-order 4 bytes].
  2071.  
  2072. So the return value will be true if the seek operation was successful.
  2073. For failure, a false value is returned and C<fileLastError()> and
  2074. C<$^E> are set to the reason for the failure.
  2075.  
  2076. =item SetHandleInformation
  2077.  
  2078. =item C<SetHandleInformation( $hObject, $uMask, $uFlags )>
  2079.  
  2080. Sets the flags associated with a Win32 native file handle or object
  2081. handle.  Returns a true value if the operation was successful.  For
  2082. failure, returns a false value and sets C<fileLastError()> and C<$^E>
  2083. for the reason for the failure.
  2084.  
  2085. C<$hObject> is an open Win32 native file handle or an open Win32 native
  2086. handle to some other type of object.
  2087.  
  2088. C<$uMask> is an unsigned value having one or more of the bits
  2089. C<HANDLE_FLAG_INHERIT> and C<HANDLE_FLAG_PROTECT_FROM_CLOSE> set.
  2090. Only bits set in C<$uMask> will be modified by C<SetHandleInformation>.
  2091.  
  2092. C<$uFlags> is an unsigned value having zero or more of the bits
  2093. C<HANDLE_FLAG_INHERIT> and C<HANDLE_FLAG_PROTECT_FROM_CLOSE> set.
  2094. For each bit set in C<$uMask>, the cooresponding bit in the handle's
  2095. flags is set to the value of the cooresponding bit in C<$uFlags>.
  2096.  
  2097. If C<$uOldFlags> were the value of the handle's flags before the
  2098. call to C<SetHandleInformation>, then the value of the handle's
  2099. flags afterward would be:
  2100.  
  2101.     ( $uOldFlags & ~$uMask ) | ( $uFlags & $uMask )
  2102.  
  2103. [at least as far as the C<HANDLE_FLAG_INHERIT> and
  2104. C<HANDLE_FLAG_PROTECT_FROM_CLOSE> bits are concerned.]
  2105.  
  2106. See the C<":HANDLE_FLAG_"> export class for the meanings of these bits.
  2107.  
  2108. =item WriteFile
  2109.  
  2110. =item C<WriteFile( $hFile, $pBuffer, $lBytes, $ouBytesWritten, $pOverlapped )>
  2111.  
  2112. Write bytes to a file or file-like device.  Returns a true value if
  2113. the operation was successful.  For failure, returns a false value and
  2114. sets C<fileLastError()> and C<$^E> for the reason for the failure.
  2115.  
  2116. C<$hFile> is a Win32 native file handle that is already open to the
  2117. file or device to be written to.
  2118.  
  2119. C<$pBuffer> is a string containing the bytes to be written.
  2120.  
  2121. C<$lBytes> is the number of bytes you would like to write.  If
  2122. C<$pBuffer> is not at least C<$lBytes> long, C<WriteFile> croaks.  You
  2123. can specify C<0> for C<$lBytes> to write C<length($pBuffer)> bytes.
  2124. A leading C<"="> on C<$lBytes> will be silently ignored, even if Perl
  2125. warnings are enabled.
  2126.  
  2127. C<$ouBytesWritten> will be set to the actual number of bytes written
  2128. unless you specify it as C<[]>.
  2129.  
  2130. C<$pOverlapped> is C<[]> or is an C<OVERLAPPED> structure packed
  2131. into a string.  This is only useful if C<$hFile> was opened with
  2132. the C<FILE_FLAG_OVERLAPPED> flag set.
  2133.  
  2134. =back
  2135.  
  2136. =item C<":FuncA">
  2137.  
  2138. The ASCII-specific functions.  Each of these is just the same as the
  2139. version without the trailing "A".
  2140.  
  2141.     CopyFileA
  2142.     CreateFileA
  2143.     DefineDosDeviceA
  2144.     DeleteFileA
  2145.     GetDriveTypeA
  2146.     GetLogicalDriveStringsA
  2147.     GetVolumeInformationA
  2148.     MoveFileA
  2149.     MoveFileExA
  2150.     QueryDosDeviceA
  2151.  
  2152. =item C<":FuncW">
  2153.  
  2154. The wide-character-specific (Unicode) functions.  Each of these is
  2155. just the same as the version without the trailing "W" except that
  2156. strings are expected in Unicode and some lengths are measured as
  2157. number of C<WCHAR>s instead of number of bytes, as indicated below.
  2158.  
  2159. =over
  2160.  
  2161. =item CopyFileW
  2162.  
  2163. =item C<CopyFileW( $swOldFileName, $swNewFileName, $bFailIfExists )>
  2164.  
  2165. C<$swOldFileName> and C<$swNewFileName> are Unicode strings.
  2166.  
  2167. =item CreateFileW
  2168.  
  2169. =item C<$hObject= CreateFileW( $swPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )>
  2170.  
  2171. C<$swPath> is Unicode.
  2172.  
  2173. =item DefineDosDeviceW
  2174.  
  2175. =item C<DefineDosDeviceW( $uFlags, $swDosDeviceName, $swTargetPath )>
  2176.  
  2177. C<$swDosDeviceName> and C<$swTargetPath> are Unicode.
  2178.  
  2179. =item DeleteFileW
  2180.  
  2181. =item C<DeleteFileW( $swFileName )>
  2182.  
  2183. C<$swFileName> is Unicode.
  2184.  
  2185. =item GetDriveTypeW
  2186.  
  2187. =item C<$uDriveType= GetDriveTypeW( $swRootPath )>
  2188.  
  2189. C<$swRootPath> is Unicode.
  2190.  
  2191. =item GetLogicalDriveStringsW
  2192.  
  2193. =item C<$olwOutLength= GetLogicalDriveStringsW( $lwBufSize, $oswBuffer )>
  2194.  
  2195. Unicode is stored in C<$oswBuffer>.  C<$lwBufSize> and C<$olwOutLength>
  2196. are measured as number of C<WCHAR>s.
  2197.  
  2198. =item GetVolumeInformationW
  2199.  
  2200. =item C<GetVolumeInformationW( $swRootPath, $oswVolName, $lwVolName, $ouSerialNum, $ouMaxNameLen, $ouFsFlags, $oswFsType, $lwFsType )>
  2201.  
  2202. C<$swRootPath> is Unicode and Unicode is written to C<$oswVolName> and
  2203. C<$oswFsType>.  C<$lwVolName> and C<$lwFsType> are measures as number
  2204. of C<WCHAR>s.
  2205.  
  2206. =item MoveFileW
  2207.  
  2208. =item C<MoveFileW( $swOldName, $swNewName )>
  2209.  
  2210. C<$swOldName> and C<$swNewName> are Unicode.
  2211.  
  2212. =item MoveFileExW
  2213.  
  2214. =item C<MoveFileExW( $swOldName, $swNewName, $uFlags )>
  2215.  
  2216. C<$swOldName> and C<$swNewName> are Unicode.
  2217.  
  2218. =item QueryDosDeviceW
  2219.  
  2220. =item C<$olwTargetLen= QueryDosDeviceW( $swDeviceName, $oswTargetPath, $lwTargetBuf )>
  2221.  
  2222. C<$swDeviceName> is Unicode and Unicode is written to
  2223. C<$oswTargetPath>.  C<$lwTargetBuf> and C<$olwTargetLen> are measured
  2224. as number of  C<WCHAR>s.
  2225.  
  2226. =back
  2227.  
  2228. =item C<":Misc">
  2229.  
  2230. Miscellaneous constants.  Used for the C<$uCreate> argument of
  2231. C<CreateFile> or the C<$uFromWhere> argument of C<SetFilePointer>.
  2232. Plus C<INVALID_HANDLE_VALUE>, which you usually won't need to check
  2233. for since most routines translate it into a false value.
  2234.  
  2235.     CREATE_ALWAYS        CREATE_NEW        OPEN_ALWAYS
  2236.     OPEN_EXISTING        TRUNCATE_EXISTING    INVALID_HANDLE_VALUE
  2237.     FILE_BEGIN        FILE_CURRENT        FILE_END
  2238.  
  2239. =item C<":DDD_">
  2240.  
  2241. Constants for the C<$uFlags> argument of C<DefineDosDevice>.
  2242.  
  2243.     DDD_EXACT_MATCH_ON_REMOVE
  2244.     DDD_RAW_TARGET_PATH
  2245.     DDD_REMOVE_DEFINITION
  2246.  
  2247. =item C<":DRIVE_">
  2248.  
  2249. Constants returned by C<GetDriveType>.
  2250.  
  2251.     DRIVE_UNKNOWN        DRIVE_NO_ROOT_DIR    DRIVE_REMOVABLE
  2252.     DRIVE_FIXED        DRIVE_REMOTE        DRIVE_CDROM
  2253.     DRIVE_RAMDISK
  2254.  
  2255. =item C<":FILE_">
  2256.  
  2257. Specific types of access to files that can be requested via the
  2258. C<$uAccess> argument to C<CreateFile>.
  2259.  
  2260.     FILE_READ_DATA            FILE_LIST_DIRECTORY
  2261.     FILE_WRITE_DATA            FILE_ADD_FILE
  2262.     FILE_APPEND_DATA        FILE_ADD_SUBDIRECTORY
  2263.     FILE_CREATE_PIPE_INSTANCE    FILE_READ_EA
  2264.     FILE_WRITE_EA            FILE_EXECUTE
  2265.     FILE_TRAVERSE            FILE_DELETE_CHILD
  2266.     FILE_READ_ATTRIBUTES        FILE_WRITE_ATTRIBUTES
  2267.     FILE_ALL_ACCESS            FILE_GENERIC_READ
  2268.     FILE_GENERIC_WRITE        FILE_GENERIC_EXECUTE )],
  2269.  
  2270. =item C<":FILE_ATTRIBUTE_">
  2271.  
  2272. File attribute constants.  Returned by C<attrLetsToBits> and used in
  2273. the C<$uFlags> argument to C<CreateFile>.
  2274.  
  2275.     FILE_ATTRIBUTE_ARCHIVE        FILE_ATTRIBUTE_COMPRESSED
  2276.     FILE_ATTRIBUTE_HIDDEN        FILE_ATTRIBUTE_NORMAL
  2277.     FILE_ATTRIBUTE_OFFLINE        FILE_ATTRIBUTE_READONLY
  2278.     FILE_ATTRIBUTE_SYSTEM        FILE_ATTRIBUTE_TEMPORARY
  2279.  
  2280. =item C<":FILE_FLAG_">
  2281.  
  2282. File option flag constants.  Used in the C<$uFlags> argument to
  2283. C<CreateFile>.
  2284.  
  2285.     FILE_FLAG_BACKUP_SEMANTICS    FILE_FLAG_DELETE_ON_CLOSE
  2286.     FILE_FLAG_NO_BUFFERING        FILE_FLAG_OVERLAPPED
  2287.     FILE_FLAG_POSIX_SEMANTICS    FILE_FLAG_RANDOM_ACCESS
  2288.     FILE_FLAG_SEQUENTIAL_SCAN    FILE_FLAG_WRITE_THROUGH
  2289.  
  2290. =item C<":FILE_SHARE_">
  2291.  
  2292. File sharing constants.  Used in the C<$uShare> argument to
  2293. C<CreateFile>.
  2294.  
  2295.     FILE_SHARE_DELETE    FILE_SHARE_READ        FILE_SHARE_WRITE
  2296.  
  2297. =item C<":FILE_TYPE_">
  2298.  
  2299. File type constants.  Returned by C<GetFileType>.
  2300.  
  2301.     FILE_TYPE_CHAR        FILE_TYPE_DISK
  2302.     FILE_TYPE_PIPE        FILE_TYPE_UNKNOWN
  2303.  
  2304. =item C<":FS_">
  2305.  
  2306. File system characteristics constants.  Placed in the C<$ouFsFlags>
  2307. argument to C<GetVolumeInformation>.
  2308.  
  2309.     FS_CASE_IS_PRESERVED        FS_CASE_SENSITIVE
  2310.     FS_UNICODE_STORED_ON_DISK    FS_PERSISTENT_ACLS 
  2311.     FS_FILE_COMPRESSION        FS_VOL_IS_COMPRESSED
  2312.  
  2313. =item C<":HANDLE_FLAG_">
  2314.  
  2315. Flag bits modifying the behavior of an object handle and accessed via
  2316. C<GetHandleInformation> and C<SetHandleInformation>.
  2317.  
  2318. =over
  2319.  
  2320. =item HANDLE_FLAG_INHERIT
  2321.  
  2322. If this bit is set, then children of this process who inherit handles
  2323. [that is, processes created by calls to the Win32 C<CreateProcess> API
  2324. with the C<bInheritHandles> parameter specified as C<TRUE>], will inherit
  2325. this particular object handle.
  2326.  
  2327. =item HANDLE_FLAG_PROTECT_FROM_CLOSE
  2328.  
  2329. If this bit is set, then calls to C<CloseHandle> against this handle
  2330. will be ignored, leaving the handle open and usable.
  2331.  
  2332. =back
  2333.  
  2334. =item C<":IOCTL_STORAGE_">
  2335.  
  2336. I/O control operations for generic storage devices.  Used in the
  2337. C<$uIoControlCode> argument to C<DeviceIoControl>.  Includes
  2338. C<IOCTL_STORAGE_CHECK_VERIFY>, C<IOCTL_STORAGE_MEDIA_REMOVAL>,
  2339. C<IOCTL_STORAGE_EJECT_MEDIA>, C<IOCTL_STORAGE_LOAD_MEDIA>,
  2340. C<IOCTL_STORAGE_RESERVE>, C<IOCTL_STORAGE_RELEASE>,
  2341. C<IOCTL_STORAGE_FIND_NEW_DEVICES>, and
  2342. C<IOCTL_STORAGE_GET_MEDIA_TYPES>.
  2343.  
  2344. =over
  2345.  
  2346. =item C<IOCTL_STORAGE_CHECK_VERIFY>
  2347.  
  2348. Verify that a device's media is accessible.  C<$pInBuf> and C<$opOutBuf>
  2349. should both be C<[]>.  If C<DeviceIoControl> returns a true value, then
  2350. the media is currently accessible.
  2351.  
  2352. =item C<IOCTL_STORAGE_MEDIA_REMOVAL>
  2353.  
  2354. Allows the device's media to be locked or unlocked.  C<$opOutBuf> should
  2355. be C<[]>.  C<$pInBuf> should be a C<PREVENT_MEDIA_REMOVAL> data structure,
  2356. which is simply an interger containing a boolean value:
  2357.  
  2358.     $pInBuf= pack( "i", $bPreventMediaRemoval );
  2359.  
  2360. =item C<IOCTL_STORAGE_EJECT_MEDIA>
  2361.  
  2362. Requests that the device eject the media.  C<$pInBuf> and C<$opOutBuf>
  2363. should both be C<[]>.  
  2364.  
  2365. =item C<IOCTL_STORAGE_LOAD_MEDIA>
  2366.  
  2367. Requests that the device load the media.  C<$pInBuf> and C<$opOutBuf>
  2368. should both be C<[]>.
  2369.  
  2370. =item C<IOCTL_STORAGE_RESERVE>
  2371.  
  2372. Requests that the device be reserved.  C<$pInBuf> and C<$opOutBuf>
  2373. should both be C<[]>.
  2374.  
  2375. =item C<IOCTL_STORAGE_RELEASE>
  2376.  
  2377. Releases a previous device reservation.  C<$pInBuf> and C<$opOutBuf>
  2378. should both be C<[]>.
  2379.  
  2380. =item C<IOCTL_STORAGE_FIND_NEW_DEVICES>
  2381.  
  2382. No documentation on this IOCTL operation was found.
  2383.  
  2384. =item C<IOCTL_STORAGE_GET_MEDIA_TYPES>
  2385.  
  2386. Requests information about the type of media supported by the device. 
  2387. C<$pInBuf> should be C<[]>.  C<$opOutBuf> will be set to contain a
  2388. vector of C<DISK_GEOMETRY> data structures, which can be decoded via:
  2389.  
  2390.     # Calculate the number of DISK_GEOMETRY structures returned:
  2391.     my $cStructs= length($opOutBuf)/(4+4+4+4+4+4);
  2392.     my @fields= unpack( "L l I L L L" x $cStructs, $opOutBuf )
  2393.     my( @ucCylsLow, @ivcCylsHigh, @uMediaType, @uTracksPerCyl,
  2394.       @uSectsPerTrack, @uBytesPerSect )= ();
  2395.     while(  @fields  ) {
  2396.     push( @ucCylsLow, unshift @fields );
  2397.     push( @ivcCylsHigh, unshift @fields );
  2398.     push( @uMediaType, unshift @fields );
  2399.     push( @uTracksPerCyl, unshift @fields );
  2400.     push( @uSectsPerTrack, unshift @fields );
  2401.     push( @uBytesPerSect, unshift @fields );
  2402.     }
  2403.  
  2404. For the C<$i>th type of supported media, the following variables will
  2405. contain the following data.
  2406.  
  2407. =over
  2408.  
  2409. =item C<$ucCylsLow[$i]>
  2410.  
  2411. The low-order 4 bytes of the total number of cylinders.
  2412.  
  2413. =item C<$ivcCylsHigh[$i]> 
  2414.  
  2415. The high-order 4 bytes of the total number of cylinders.
  2416.  
  2417. =item C<$uMediaType[$i]>
  2418.  
  2419. A code for the type of media.  See the C<":MEDIA_TYPE"> export class.
  2420.  
  2421. =item C<$uTracksPerCyl[$i]>
  2422.  
  2423. The number of tracks in each cylinder.
  2424.  
  2425. =item C<$uSectsPerTrack[$i]>
  2426.  
  2427. The number of sectors in each track.
  2428.  
  2429. =item C<$uBytesPerSect[$i]>
  2430.  
  2431. The number of bytes in each sector.
  2432.  
  2433. =back
  2434.  
  2435. =back
  2436.  
  2437. =item C<":IOCTL_DISK_">
  2438.  
  2439. I/O control operations for disk devices.  Used in the C<$uIoControlCode>
  2440. argument to C<DeviceIoControl>.  Most of these are to be used on
  2441. physical drive devices like C<"//./PhysicalDrive0">.  However,
  2442. C<IOCTL_DISK_GET_PARTITION_INFO> and C<IOCTL_DISK_SET_PARTITION_INFO>
  2443. should only be used on a single-partition device like C<"//./C:">.  Also,
  2444. C<IOCTL_DISK_GET_MEDIA_TYPES> is documented as having been superceded but
  2445. is still useful when used on a floppy device like C<"//./A:">.
  2446.  
  2447. Includes C<IOCTL_DISK_FORMAT_TRACKS>, C<IOCTL_DISK_FORMAT_TRACKS_EX>,
  2448. C<IOCTL_DISK_GET_DRIVE_GEOMETRY>, C<IOCTL_DISK_GET_DRIVE_LAYOUT>,
  2449. C<IOCTL_DISK_GET_MEDIA_TYPES>, C<IOCTL_DISK_GET_PARTITION_INFO>,
  2450. C<IOCTL_DISK_HISTOGRAM_DATA>, C<IOCTL_DISK_HISTOGRAM_RESET>,
  2451. C<IOCTL_DISK_HISTOGRAM_STRUCTURE>, C<IOCTL_DISK_IS_WRITABLE>,
  2452. C<IOCTL_DISK_LOGGING>, C<IOCTL_DISK_PERFORMANCE>,
  2453. C<IOCTL_DISK_REASSIGN_BLOCKS>, C<IOCTL_DISK_REQUEST_DATA>,
  2454. C<IOCTL_DISK_REQUEST_STRUCTURE>, C<IOCTL_DISK_SET_DRIVE_LAYOUT>,
  2455. C<IOCTL_DISK_SET_PARTITION_INFO>, and C<IOCTL_DISK_VERIFY>.
  2456.  
  2457. =over
  2458.  
  2459. =item C<IOCTL_DISK_GET_DRIVE_GEOMETRY>
  2460.  
  2461. Request information about the size and geometry of the disk.  C<$pInBuf>
  2462. should be C<[]>.  C<$opOutBuf> will be set to a C<DISK_GEOMETRY> data
  2463. structure which can be decode via:
  2464.  
  2465.     ( $ucCylsLow, $ivcCylsHigh, $uMediaType, $uTracksPerCyl,
  2466.       $uSectsPerTrack, $uBytesPerSect )= unpack( "L l I L L L", $opOutBuf );
  2467.  
  2468. =over
  2469.  
  2470. =item C<$ucCylsLow>
  2471.  
  2472. The low-order 4 bytes of the total number of cylinders.
  2473.  
  2474. =item C<$ivcCylsHigh> 
  2475.  
  2476. The high-order 4 bytes of the total number of cylinders.
  2477.  
  2478. =item C<$uMediaType>
  2479.  
  2480. A code for the type of media.  See the C<":MEDIA_TYPE"> export class.
  2481.  
  2482. =item C<$uTracksPerCyl>
  2483.  
  2484. The number of tracks in each cylinder.
  2485.  
  2486. =item C<$uSectsPerTrack>
  2487.  
  2488. The number of sectors in each track.
  2489.  
  2490. =item C<$uBytesPerSect>
  2491.  
  2492. The number of bytes in each sector.
  2493.  
  2494. =back
  2495.  
  2496. =item C<IOCTL_DISK_GET_PARTITION_INFO>
  2497.  
  2498. Request information about the size and geometry of the partition. 
  2499. C<$pInBuf> should be C<[]>.  C<$opOutBuf> will be set to a
  2500. C<PARTITION_INFORMATION> data structure which can be decode via:
  2501.  
  2502.     ( $uStartLow, $ivStartHigh, $ucHiddenSects, $uPartitionSeqNumber,
  2503.       $uPartitionType, $bActive, $bRecognized, $bToRewrite )=
  2504.       unpack( "L l L L C c c c", $opOutBuf );
  2505.  
  2506. =over
  2507.  
  2508. =item C<$uStartLow> and C<$ivStartHigh>
  2509.  
  2510. The low-order and high-order [respectively] 4 bytes of the starting
  2511. offset of the partition, measured in bytes.
  2512.  
  2513. =item C<$ucHiddenSects>
  2514.  
  2515. The number of "hidden" sectors for this partition.  Actually this is
  2516. the number of sectors found prior to this partiton, that is, the
  2517. starting offset [as found in C<$uStartLow> and C<$ivStartHigh>]
  2518. divided by the number of bytes per sector.
  2519.  
  2520. =item C<$uPartitionSeqNumber>
  2521.  
  2522. The sequence number of this partition.  Partitions are numbered
  2523. starting as C<1> [with "partition 0" meaning the entire disk].  
  2524. Sometimes this field may be C<0> and you'll have to infer the
  2525. partition sequence number from how many partitions preceed it on
  2526. the disk.
  2527.  
  2528. =item C<$uPartitionType>
  2529.  
  2530. The type of partition.  See the C<":PARTITION_"> export class for a
  2531. list of known types.  See also C<IsRecognizedPartition> and
  2532. C<IsContainerPartition>.
  2533.  
  2534. =item C<$bActive>
  2535.  
  2536. C<1> for the active [boot] partition, C<0> otherwise.
  2537.  
  2538. =item C<$bRecognized>
  2539.  
  2540. Whether this type of partition is support under Win32.
  2541.  
  2542. =item C<$bToRewrite>
  2543.  
  2544. Whether to update this partition information.  This field is not used
  2545. by C<IOCTL_DISK_GET_PARTITION_INFO>.  For
  2546. C<IOCTL_DISK_SET_DRIVE_LAYOUT>, you must set this field to a true
  2547. value for any partitions you wish to have changed, added, or deleted.
  2548.  
  2549. =back
  2550.  
  2551. =item C<IOCTL_DISK_SET_PARTITION_INFO>
  2552.  
  2553. Change the type of the partition.  C<$opOutBuf> should be C<[]>.
  2554. C<$pInBuf> should be a C<SET_PARTITION_INFORMATION> data structure
  2555. which is just a single byte containing the new parition type [see
  2556. the C<":PARTITION_"> export class for a list of known types]:
  2557.  
  2558.     $pInBuf= pack( "C", $uPartitionType );
  2559.  
  2560. =item C<IOCTL_DISK_GET_DRIVE_LAYOUT>
  2561.  
  2562. Request information about the disk layout.  C<$pInBuf> should be C<[]>.
  2563. C<$opOutBuf> will be set to contain C<DRIVE_LAYOUT_INFORMATION>
  2564. structure including several C<PARTITION_INFORMATION> structures:
  2565.  
  2566.     my( $cPartitions, $uDiskSignature )= unpack( "L L", $opOutBuf );
  2567.     my @fields= unpack( "x8" . ( "L l L L C c c c" x $cPartitions ),
  2568.                 $opOutBuf );
  2569.     my( @uStartLow, @ivStartHigh, @ucHiddenSects,
  2570.       @uPartitionSeqNumber, @uPartitionType, @bActive,
  2571.       @bRecognized, @bToRewrite )= ();
  2572.     for(  1..$cPartition  ) {
  2573.     push( @uStartLow, unshift @fields );
  2574.     push( @ivStartHigh, unshift @fields );
  2575.     push( @ucHiddenSects, unshift @fields );
  2576.     push( @uPartitionSeqNumber, unshift @fields );
  2577.     push( @uPartitionType, unshift @fields );
  2578.     push( @bActive, unshift @fields );
  2579.     push( @bRecognized, unshift @fields );
  2580.     push( @bToRewrite, unshift @fields );
  2581.     }
  2582.  
  2583. =over
  2584.  
  2585. =item C<$cPartitions>
  2586.  
  2587. If the number of partitions on the disk.
  2588.  
  2589. =item C<$uDiskSignature>
  2590.  
  2591. Is the disk signature, a unique number assigned by Disk Administrator
  2592. [F<WinDisk.exe>] and used to identify the disk.  This allows drive
  2593. letters for partitions on that disk to remain constant even if the
  2594. SCSI Target ID of the disk gets changed.
  2595.  
  2596. =back
  2597.  
  2598. See C<IOCTL_DISK_GET_PARTITION_INFORMATION> for information on the
  2599. remaining these fields.
  2600.  
  2601. =item C<IOCTL_DISK_GET_MEDIA_TYPES>
  2602.  
  2603. Is supposed to be superseded by C<IOCTL_STORAGE_GET_MEDIA_TYPES> but
  2604. is still useful for determining the types of floppy diskette formats
  2605. that can be produced by a given floppy drive.  See
  2606. F<ex/FormatFloppy.plx> for an example.
  2607.  
  2608. =item C<IOCTL_DISK_SET_DRIVE_LAYOUT>
  2609.  
  2610. Change the partition layout of the disk.  C<$pOutBuf> should be C<[]>.
  2611. C<$pInBuf> should be a C<DISK_LAYOUT_INFORMATION> data structure
  2612. including several C<PARTITION_INFORMATION> data structures.
  2613.  
  2614.     # Already set:  $cPartitions, $uDiskSignature, @uStartLow, @ivStartHigh,
  2615.     #   @ucHiddenSects, @uPartitionSeqNumber, @uPartitionType, @bActive,
  2616.     #   @bRecognized, and @bToRewrite.
  2617.     my( @fields, $prtn )= ();
  2618.     for $prtn (  1..$cPartition  ) {
  2619.     push( @fields, $uStartLow[$prtn-1], $ivStartHigh[$prtn-1],
  2620.         $ucHiddenSects[$prtn-1], $uPartitionSeqNumber[$prtn-1],
  2621.         $uPartitionType[$prtn-1], $bActive[$prtn-1],
  2622.         $bRecognized[$prtn-1], $bToRewrite[$prtn-1] );
  2623.     }
  2624.     $pInBuf= pack( "L L" . ( "L l L L C c c c" x $cPartitions ),
  2625.            $cPartitions, $uDiskSignature, @fields );
  2626.  
  2627. To delete a partition, zero out all fields except for C<$bToRewrite>
  2628. which should be set to C<1>.  To add a partition, increment
  2629. C<$cPartitions> and add the information for the new partition
  2630. into the arrays, making sure that you insert C<1> into @bToRewrite.
  2631.  
  2632. See C<IOCTL_DISK_GET_DRIVE_LAYOUT> and
  2633. C<IOCTL_DISK_GET_PARITITON_INFORMATION> for descriptions of the
  2634. fields.
  2635.  
  2636. =item C<IOCTL_DISK_VERIFY>
  2637.  
  2638. Performs a logical format of [part of] the disk.  C<$opOutBuf> should
  2639. be C<[]>.  C<$pInBuf> should contain a C<VERIFY_INFORMATION> data
  2640. structure:
  2641.  
  2642.     $pInBuf= pack( "L l L",
  2643.            $uStartOffsetLow, $ivStartOffsetHigh, $uLength );
  2644.  
  2645. =over
  2646.  
  2647. =item C<$uStartOffsetLow> and C<$ivStartOffsetHigh>
  2648.  
  2649. The low-order and high-order [respectively] 4 bytes of the offset [in
  2650. bytes] where the formatting should begin.
  2651.  
  2652. =item C<$uLength>
  2653.  
  2654. The length [in bytes] of the section to be formatted.
  2655.  
  2656. =back
  2657.  
  2658. =item C<IOCTL_DISK_FORMAT_TRACKS>
  2659.  
  2660. Format a range of tracks on the disk.  C<$opOutBuf> should be C<[]>. 
  2661. C<$pInBuf> should contain a C<FORMAT_PARAMETERS> data structure:
  2662.  
  2663.     $pInBuf= pack( "L L L L L", $uMediaType,
  2664.            $uStartCyl, $uEndCyl, $uStartHead, $uEndHead );
  2665.  
  2666. C<$uMediaType> if the type of media to be formatted.  Mostly used to
  2667. specify the density to use when formatting a floppy diskette.  See the
  2668. C<":MEDIA_TYPE"> export class for more information.
  2669.  
  2670. The remaining fields specify the starting and ending cylinder and
  2671. head of the range of tracks to be formatted.
  2672.  
  2673. =item C<IOCTL_DISK_REASSIGN_BLOCKS>
  2674.  
  2675. Reassign a list of disk blocks to the disk's spare-block pool. 
  2676. C<$opOutBuf> should be C<[]>.  C<$pInBuf> should be a
  2677. C<REASSIGN_BLOCKS> data structure:
  2678.  
  2679.     $pInBuf= pack( "S S L*", 0, $cBlocks, @uBlockNumbers );
  2680.  
  2681. =item C<IOCTL_DISK_PERFORMANCE>
  2682.  
  2683. Request information about disk performance.  C<$pInBuf> should be C<[]>.
  2684. C<$opOutBuf> will be set to contain a C<DISK_PERFORMANCE> data structure:
  2685.  
  2686.     my( $ucBytesReadLow, $ivcBytesReadHigh,
  2687.     $ucBytesWrittenLow, $ivcBytesWrittenHigh,
  2688.     $uReadTimeLow, $ivReadTimeHigh,
  2689.     $uWriteTimeLow, $ivWriteTimeHigh,
  2690.     $ucReads, $ucWrites, $uQueueDepth )=
  2691.     unpack( "L l L l L l L l L L L", $opOutBuf );
  2692.  
  2693. =item C<IOCTL_DISK_IS_WRITABLE>
  2694.  
  2695. No documentation on this IOCTL operation was found.
  2696.  
  2697. =item C<IOCTL_DISK_LOGGING>
  2698.  
  2699. Control disk logging.  Little documentation for this IOCTL operation
  2700. was found.  It makes use of a C<DISK_LOGGING> data structure:
  2701.  
  2702. =over
  2703.  
  2704. =item DISK_LOGGING_START
  2705.  
  2706. Start logging each disk request in a buffer internal to the disk device
  2707. driver of size C<$uLogBufferSize>:
  2708.  
  2709.     $pInBuf= pack( "C L L", 0, 0, $uLogBufferSize );
  2710.  
  2711. =item DISK_LOGGING_STOP
  2712.  
  2713. Stop loggin each disk request:
  2714.  
  2715.     $pInBuf= pack( "C L L", 1, 0, 0 );
  2716.  
  2717. =item DISK_LOGGING_DUMP
  2718.  
  2719. Copy the interal log into the supplied buffer:
  2720.  
  2721.     $pLogBuffer= ' ' x $uLogBufferSize
  2722.     $pInBuf= pack( "C P L", 2, $pLogBuffer, $uLogBufferSize );
  2723.  
  2724.     ( $uByteOffsetLow[$i], $ivByteOffsetHigh[$i],
  2725.       $uStartTimeLow[$i], $ivStartTimeHigh[$i],
  2726.       $uEndTimeLog[$i], $ivEndTimeHigh[$i],
  2727.       $hVirtualAddress[$i], $ucBytes[$i],
  2728.       $uDeviceNumber[$i], $bWasReading[$i] )=
  2729.       unpack( "x".(8+8+8+4+4+1+1+2)." L l L l L l L L C c x2", $pLogBuffer );
  2730.  
  2731. =item DISK_LOGGING_BINNING
  2732.  
  2733. Keep statics grouped into bins based on request sizes.
  2734.  
  2735.     $pInBuf= pack( "C P L", 3, $pUnknown, $uUnknownSize );
  2736.  
  2737. =back
  2738.  
  2739. =item C<IOCTL_DISK_FORMAT_TRACKS_EX>
  2740.  
  2741. No documentation on this IOCTL is included.
  2742.  
  2743. =item C<IOCTL_DISK_HISTOGRAM_STRUCTURE>
  2744.  
  2745. No documentation on this IOCTL is included.
  2746.  
  2747. =item C<IOCTL_DISK_HISTOGRAM_DATA>
  2748.  
  2749. No documentation on this IOCTL is included.
  2750.  
  2751. =item C<IOCTL_DISK_HISTOGRAM_RESET>
  2752.  
  2753. No documentation on this IOCTL is included.
  2754.  
  2755. =item C<IOCTL_DISK_REQUEST_STRUCTURE>
  2756.  
  2757. No documentation on this IOCTL operation was found.
  2758.  
  2759. =item C<IOCTL_DISK_REQUEST_DATA>
  2760.  
  2761. No documentation on this IOCTL operation was found.
  2762.  
  2763. =back
  2764.  
  2765. =item C<":GENERIC_">
  2766.  
  2767. Constants specifying generic access permissions that are not specific
  2768. to one type of object.
  2769.  
  2770.     GENERIC_ALL            GENERIC_EXECUTE
  2771.     GENERIC_READ            GENERIC_WRITE
  2772.  
  2773. =item C<":MEDIA_TYPE">
  2774.  
  2775. Different classes of media that a device can support.  Used in the
  2776. C<$uMediaType> field of a C<DISK_GEOMETRY> structure.
  2777.  
  2778. =over
  2779.  
  2780. =item C<Unknown>
  2781.  
  2782. Format is unknown.
  2783.  
  2784. =item C<F5_1Pt2_512>
  2785.  
  2786. 5.25" floppy, 1.2MB [really 1,200KB] total space, 512 bytes/sector.
  2787.  
  2788. =item C<F3_1Pt44_512>
  2789.  
  2790. 3.5" floppy, 1.44MB [really 1,440KB] total space, 512 bytes/sector.
  2791.  
  2792. =item C<F3_2Pt88_512>
  2793.  
  2794. 3.5" floppy, 2.88MB [really 2,880KB] total space, 512 bytes/sector.
  2795.  
  2796. =item C<F3_20Pt8_512>
  2797.  
  2798. 3.5" floppy, 20.8MB total space, 512 bytes/sector.
  2799.  
  2800. =item C<F3_720_512>
  2801.  
  2802. 3.5" floppy, 720KB total space, 512 bytes/sector.
  2803.  
  2804. =item C<F5_360_512>
  2805.  
  2806. 5.25" floppy, 360KB total space, 512 bytes/sector.
  2807.  
  2808. =item C<F5_320_512>
  2809.  
  2810. 5.25" floppy, 320KB total space, 512 bytes/sector.
  2811.  
  2812. =item C<F5_320_1024>
  2813.  
  2814. 5.25" floppy, 320KB total space, 1024 bytes/sector.
  2815.  
  2816. =item C<F5_180_512>
  2817.  
  2818. 5.25" floppy, 180KB total space, 512 bytes/sector.
  2819.  
  2820. =item C<F5_160_512>
  2821.  
  2822. 5.25" floppy, 160KB total space, 512 bytes/sector.
  2823.  
  2824. =item C<RemovableMedia>
  2825.  
  2826. Some type of removable media other than a floppy diskette.
  2827.  
  2828. =item C<FixedMedia>
  2829.  
  2830. A fixed hard disk.
  2831.  
  2832. =item C<F3_120M_512>
  2833.  
  2834. 3.5" floppy, 120MB total space.
  2835.  
  2836. =back
  2837.  
  2838. =item C<":MOVEFILE_">
  2839.  
  2840. Constants for use in C<$uFlags> arguments to C<MoveFileEx>.
  2841.  
  2842.     MOVEFILE_COPY_ALLOWED        MOVEFILE_DELAY_UNTIL_REBOOT
  2843.     MOVEFILE_REPLACE_EXISTING    MOVEFILE_WRITE_THROUGH
  2844.  
  2845. =item C<":SECURITY_">
  2846.  
  2847. Security quality of service values that can be used in the C<$uFlags>
  2848. argument to C<CreateFile> if opening the client side of a named pipe.
  2849.  
  2850.     SECURITY_ANONYMOUS        SECURITY_CONTEXT_TRACKING
  2851.     SECURITY_DELEGATION        SECURITY_EFFECTIVE_ONLY
  2852.     SECURITY_IDENTIFICATION        SECURITY_IMPERSONATION
  2853.     SECURITY_SQOS_PRESENT
  2854.  
  2855. =item C<":SEM_">
  2856.  
  2857. Constants to be used with C<SetErrorMode>.
  2858.  
  2859.     SEM_FAILCRITICALERRORS        SEM_NOGPFAULTERRORBOX
  2860.     SEM_NOALIGNMENTFAULTEXCEPT    SEM_NOOPENFILEERRORBOX
  2861.  
  2862. =item C<":PARTITION_">
  2863.  
  2864. Constants describing partition types.
  2865.  
  2866.     PARTITION_ENTRY_UNUSED        PARTITION_FAT_12
  2867.     PARTITION_XENIX_1        PARTITION_XENIX_2
  2868.     PARTITION_FAT_16        PARTITION_EXTENDED
  2869.     PARTITION_HUGE            PARTITION_IFS
  2870.     PARTITION_FAT32            PARTITION_FAT32_XINT13
  2871.     PARTITION_XINT13        PARTITION_XINT13_EXTENDED
  2872.     PARTITION_PREP            PARTITION_UNIX
  2873.     VALID_NTFT            PARTITION_NTFT
  2874.  
  2875. =item C<":ALL">
  2876.  
  2877. All of the above.
  2878.  
  2879. =back
  2880.  
  2881. =head1 BUGS
  2882.  
  2883. None known at this time.
  2884.  
  2885. =head1 AUTHOR
  2886.  
  2887. Tye McQueen, tye@metronet.com, http://www.metronet.com/~tye/.
  2888.  
  2889. =head1 SEE ALSO
  2890.  
  2891. The pyramids.
  2892.  
  2893. =cut
  2894.