summaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
authorYitzchak Scott-Thoennes <sthoenna@efn.org>2007-02-19 17:50:18 -0800
committerSteve Hay <SteveHay@planit.com>2007-02-22 09:09:31 +0000
commit78ff2d7be71ff9f6811d8b05bb66c4c4707951ba (patch)
treea2013860b69217e66dd1332f49526b63ed76d5b8 /win32
parent097911b5e678dd1e36060b9c7d2408b8eb887a7a (diff)
downloadperl-78ff2d7be71ff9f6811d8b05bb66c4c4707951ba.tar.gz
Re: Win32 modules & cygwin
From: "Yitzchak Scott-Thoennes" <sthoenna@efn.org> Message-ID: <1254.67.42.109.122.1171965018.squirrel@67.42.109.122> Also includes integration & deletion of win32/ext/Win32API to ext/Win32API, and addition of copyright message and corrections to spacing/tabbing as suggested by Jan Dubois. p4raw-id: //depot/perl@30379
Diffstat (limited to 'win32')
-rw-r--r--win32/FindExt.pm2
-rw-r--r--win32/Makefile12
-rw-r--r--win32/config_sh.PL2
-rw-r--r--win32/ext/Win32API/File/Changes103
-rw-r--r--win32/ext/Win32API/File/ExtUtils/Myconst2perl.pm361
-rw-r--r--win32/ext/Win32API/File/File.pm3035
-rw-r--r--win32/ext/Win32API/File/File.xs647
-rw-r--r--win32/ext/Win32API/File/Makefile.PL127
-rw-r--r--win32/ext/Win32API/File/README133
-rw-r--r--win32/ext/Win32API/File/buffers.h423
-rw-r--r--win32/ext/Win32API/File/cFile.h1
-rw-r--r--win32/ext/Win32API/File/cFile.pc165
-rw-r--r--win32/ext/Win32API/File/const2perl.h193
-rw-r--r--win32/ext/Win32API/File/t/file.t408
-rw-r--r--win32/ext/Win32API/File/t/tie.t79
-rw-r--r--win32/ext/Win32API/File/typemap140
-rw-r--r--win32/makefile.mk12
-rw-r--r--win32/win32.c68
18 files changed, 22 insertions, 5889 deletions
diff --git a/win32/FindExt.pm b/win32/FindExt.pm
index eb0eb3b662..f0477b8846 100644
--- a/win32/FindExt.pm
+++ b/win32/FindExt.pm
@@ -82,7 +82,7 @@ sub find_ext
closedir $dh;
for my $xxx (@items) {
if ($xxx ne "DynaLoader") {
- if (-f "$xxx/$xxx.xs") {
+ if (-f "$xxx/$xxx.xs" || -f "$xxx/$xxx.c" ) {
$ext{"$_[0]$xxx"} = $static{"$_[0]$xxx"} ? 'static' : 'dynamic';
} elsif (-f "$xxx/Makefile.PL") {
$ext{"$_[0]$xxx"} = 'nonxs';
diff --git a/win32/Makefile b/win32/Makefile
index 8299d1c9fa..71b99c3af8 100644
--- a/win32/Makefile
+++ b/win32/Makefile
@@ -771,7 +771,7 @@ SETARGV_OBJ = setargv$(o)
# specify static extensions here
#STATIC_EXT = Cwd Compress/Raw/Zlib
-STATIC_EXT =
+STATIC_EXT = Win32CORE
DYNALOADER = $(EXTDIR)\DynaLoader\DynaLoader
@@ -1005,26 +1005,26 @@ MakePPPort_clean:
Extensions: buildext.pl $(PERLDEP) $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
$(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) $(EXTDIR) --dynamic
- $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext --dynamic
+ -if exist ext $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext --dynamic
Extensions_reonly: buildext.pl $(PERLDEP) $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
$(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) $(EXTDIR) --dynamic +re
- $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext --dynamic +re
+ -if exist ext $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext --dynamic +re
Extensions_static : buildext.pl $(PERLDEP) $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
$(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) $(EXTDIR) --static
- $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext --static
+ -if exist ext $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext --static
$(MINIPERL) -I..\lib buildext.pl --list-static-libs > Extensions_static
Extensions_clean:
-if exist $(MINIPERL) $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) $(EXTDIR) clean
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext clean
+ -if exist $(MINIPERL) if exist ext $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext clean
Extensions_realclean:
-if exist $(MINIPERL) $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) $(EXTDIR) realclean
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext realclean
+ -if exist $(MINIPERL) if exist ext $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext realclean
#-------------------------------------------------------------------------------
diff --git a/win32/config_sh.PL b/win32/config_sh.PL
index 884db4a537..98c01eb3c9 100644
--- a/win32/config_sh.PL
+++ b/win32/config_sh.PL
@@ -43,7 +43,7 @@ while (@{$optref} && $optref->[0] =~ /^([\w_]+)=(.*)$/) {
}
FindExt::scan_ext("../ext");
-FindExt::scan_ext("ext");
+FindExt::scan_ext("ext") if -d 'ext'; # also look in win32/ext/ if it exists
FindExt::set_static_extensions(split ' ', $opt{'static_ext'});
my @dynamic_ext = grep(!/Thread/,FindExt::dynamic_ext());
diff --git a/win32/ext/Win32API/File/Changes b/win32/ext/Win32API/File/Changes
deleted file mode 100644
index b63b2763da..0000000000
--- a/win32/ext/Win32API/File/Changes
+++ /dev/null
@@ -1,103 +0,0 @@
-Revision history for Perl extension Win32API::File.
-
-0.1001 2006-07-02 14:04
- - Minor doc tweak, release as standalone for sychronization with
- with version in bleadperl (future 5.10)
-
-0.10 2005-09-09
- - Added GetFileAttributes() function and corresponding constants.
- (Patches from Kenneth Olwing from 2004-11-12).
- - cygwin patches from Rafael Kitover and Reini Urban.
- This includes the addition of the GetFileSize(), getFileSize()
- setFilePointer() and GetOverlappedResult() methods and the
- experimental new object oriented interface. All file position
- operations use either Math::BigInt objects or 8 byte integers
- (cygwin) for file offsets.
-
-0.0901 2005-08-30
- - increased version number to show difference to standalone
- CPAN release of Win32API-File-0.09.zip
-
-0.09 2005-02-18
- - Support 5.007+
-
-0.09 [libwin32 version only]
- - Add AUTHOR and ABSTRACT_FROM to Makefile.PL.
- - Trivial speed improvements.
- - Fixed F<test.pl> if Z: is a valid drive letter.
-
-0.08 2000-04-07
- - C<GetOsFHandle> now returns false for failure.
- - New F<buffers.h> supports C++ compilers.
- - Read-only output-only parameters now generate an error.
- - Added fileLastError() since C<$^E> is often quickly overwritten.
- - Complete rewrite of how C constants are made available in Perl.
- - Added fileConstant(), a nice way to look-up constants at run time.
- - Added Get/SetHandleInformation and HANDLE_FLAG_* constants.
- - Added IOCTL_DISK_GET_MEDIA_TYPES since *_STORAGE_* fails for floppy.
- - Added several example scripts.
-
-0.07 1999-08-17
- - Added DeleteFile().
- - Removed prototypes from OsFHandleOpen() and GetOsFHandle() since
- the C<*> doesn't prevent warnings about bareword file handles and
- prevents the useful usage message if no arguments given.
- - Fixed bug due to failed C<(/k/i,/t/i)> in list context returning
- C<()> not C<(undef,undef)> in modern versions of Perl.
- - Change order of C<#include>s so can build with Perl5.005 and later.
- - Fixed C<test.pl> to ignore Perl bug where C<$^E> is truncated.
- - Turned on C<CAPI> in C<Makefile.PL> for certain versions of Perl.
- - Updated C<README>.
-
-0.06 1999-08-10
- - Switch to new buffers.h and "Hungarian" notation!
- - Added full documentation!
- - ReadFile() no longer tries to read more bytes than asked for
- just because the scalar buffer can hold more bytes!
- - createFile() does better DWIM for share mode.
- - Return SV_NO rather than C<0> for Boolean false.
- - For boolean args, non-empty strings are C<1>, don't convert to int.
- - Added ":MEDIA_TYPE" export class.
- - Added C<GENERIC_ALL> and C<GENERIC_EXECUTE> to ":GENERIC_" exports.
- - Added C<FdGetOsFHandle()> and C<GetOsFHandle()>!
- - Added C<OsFHandleOpenFd()> and C<OsFHandleOpen()>!
- - Support calling C<constant()> without the useless integer argument.
- - Auto-load/export constants with C<()> prototype so can be in-lined.
- - Added C<IsRecognizedPartition()> and C<IsContainerPartition()>.
- - Added C<getLogicalDrives()>.
- - Added ":FILE_" export class for specific types of access to files.
- - Added C<SECURITY_SQOS_PRESENT> to ":SECURITY_" export class.
- - Added ":PARTITION_" export class for partition types.
- - Seriously bulked up the test suite.
-
-0.05 1998-08-21
- - "-w" no longer warns that a buffer size of "=99" "isn't numeric".
- nor if pass undef var for buffer size or output-only parameter.
- - Added SetErrorMode() and :SEM_.
- - createFile() sharing now defaults to "rw" to match C RTL.
- - createFile() was ignoring "r" and "w" in access masks.
-
-0.04 1998-08-13
- - Added GetLogicalDrives and GetLogicalDriveStrings.
- - Added GetDriveType and GetVolumeInformation.
- - Added DRIVE_* for GetDriveType().
- - Added FS_* for GetVolumeInformation().
- - Added createFile(), getLogicalDrives(), and attrLetsToBits() helpers.
- - CreateFile() returns: INVALID_HANDLE_VALUE->false, 0->"0 but true".
- - More standardized "Hungarian" notation and uses buffers.h.
- - Large unsigned values no longer made negative.
-
-0.03 1998-04-25
- - Added DDD_* constants to File.pm and moved codes mistakenly
- exported for :DDD_ to be exported for :Misc.
- - Split large group of constants to increase efficiency.
- - Minor cosmetic fixes.
-
-0.02 1998-03-03
- - Added DeviceIoControl().
- - Added some IOCTL_STORAGE_* and IOCTL_DISK_* constants
- - Taught test.pl to verify all exported functions and constants.
-
-0.01 1997-12-08
- - original version; based on Win32API::Registry.
- - release to partner
diff --git a/win32/ext/Win32API/File/ExtUtils/Myconst2perl.pm b/win32/ext/Win32API/File/ExtUtils/Myconst2perl.pm
deleted file mode 100644
index d4f936e107..0000000000
--- a/win32/ext/Win32API/File/ExtUtils/Myconst2perl.pm
+++ /dev/null
@@ -1,361 +0,0 @@
-# This should eventually become part of MakeMaker as ExtUtils::Mkconst2perl.
-# Documentation for this is very skimpy at this point. Full documentation
-# will be added to ExtUtils::Mkconst2perl when it is created.
-package ExtUtils::Myconst2perl;
-
-use strict;
-use Config;
-
-use vars qw( @ISA @EXPORT @EXPORT_OK $VERSION );
-BEGIN {
- require Exporter;
- push @ISA, 'Exporter';
- @EXPORT= qw( &Myconst2perl );
- @EXPORT_OK= qw( &ParseAttribs );
- $VERSION= 1.00;
-}
-
-use Carp;
-use File::Basename;
-use ExtUtils::MakeMaker qw( neatvalue );
-
-# Return the extension to use for a file of C++ source code:
-sub _cc
-{
- # Some day, $Config{_cc} might be defined for us:
- return $Config{_cc} if $Config{_cc};
- return ".cxx"; # Seems to be the most widely accepted extension.
-}
-
-=item ParseAttribs
-
-Parses user-firendly options into coder-firendly specifics.
-
-=cut
-
-sub ParseAttribs
-{
- # Usage: ParseAttribs( "Package::Name", \%opts, {opt=>\$var} );
- my( $pkg, $hvAttr, $hvRequests )= @_;
- my( $outfile, @perlfiles, %perlfilecodes, @cfiles, %cfilecodes );
- my @importlist= @{$hvAttr->{IMPORT_LIST}};
- my $perlcode= $hvAttr->{PERL_PE_CODE} ||
- 'last if /^\s*(bootstrap|XSLoader::load)\b/';
- my $ccode= $hvAttr->{C_PE_CODE} ||
- 'last if m#/[/*]\s*CONSTS_DEFINED\b|^\s*MODULE\b#';
- my $ifdef= $hvAttr->{IFDEF} || 0;
- my $writeperl= !! $hvAttr->{WRITE_PERL};
- my $export= !! $hvAttr->{DO_EXPORT};
- my $importto= $hvAttr->{IMPORT_TO} || "_constants";
- my $cplusplus= $hvAttr->{CPLUSPLUS};
- $cplusplus= "" if ! defined $cplusplus;
- my $object= "";
- my $binary= "";
- my $final= "";
- my $norebuild= "";
- my $subroutine= "";
- my $base;
- my %params= (
- PERL_PE_CODE => \$perlcode,
- PERL_FILE_LIST => \@perlfiles,
- PERL_FILE_CODES => \%perlfilecodes,
- PERL_FILES => sub { map {($_,$perlfilecodes{$_})} @perlfiles },
- C_PE_CODE => \$ccode,
- C_FILE_LIST => \@cfiles,
- C_FILE_CODES => \%cfilecodes,
- C_FILES => sub { map {($_,$cfilecodes{$_})} @cfiles },
- DO_EXPORT => \$export,
- IMPORT_TO => \$importto,
- IMPORT_LIST => \@importlist,
- SUBROUTINE => \$subroutine,
- IFDEF => \$ifdef,
- WRITE_PERL => \$writeperl,
- CPLUSPLUS => \$cplusplus,
- BASEFILENAME => \$base,
- OUTFILE => \$outfile,
- OBJECT => \$object,
- BINARY => \$binary,
- FINAL_PERL => \$final,
- NO_REBUILD => \$norebuild,
- );
- { my @err= grep {! defined $params{$_}} keys %$hvAttr;
- carp "ExtUtils::Myconst2perl::ParseAttribs: ",
- "Unsupported option(s) (@err).\n"
- if @err;
- }
- $norebuild= $hvAttr->{NO_REBUILD} if exists $hvAttr->{NO_REBUILD};
- my $module= ( split /::/, $pkg )[-1];
- $base= "c".$module;
- $base= $hvAttr->{BASEFILENAME} if exists $hvAttr->{BASEFILENAME};
- my $ext= ! $cplusplus ? ($Config{_c}||".c")
- : $cplusplus =~ /^[.]/ ? $cplusplus : _cc();
- if( $writeperl ) {
- $outfile= $base . "_pc" . $ext;
- $object= $base . "_pc" . ($Config{_o}||$Config{obj_ext});
- $object= $hvAttr->{OBJECT} if $hvAttr->{OBJECT};
- $binary= $base . "_pc" . ($Config{_exe}||$Config{exe_ext});
- $binary= $hvAttr->{BINARY} if $hvAttr->{BINARY};
- $final= $base . ".pc";
- $final= $hvAttr->{FINAL_PERL} if $hvAttr->{FINAL_PERL};
- $subroutine= "main";
- } elsif( $cplusplus ) {
- $outfile= $base . $ext;
- $object= $base . ($Config{_o}||$Config{obj_ext});
- $object= $hvAttr->{OBJECT} if $hvAttr->{OBJECT};
- $subroutine= "const2perl_" . $pkg;
- $subroutine =~ s/\W/_/g;
- } else {
- $outfile= $base . ".h";
- }
- $outfile= $hvAttr->{OUTFILE} if $hvAttr->{OUTFILE};
- if( $hvAttr->{PERL_FILES} ) {
- carp "ExtUtils::Myconst2perl: PERL_FILES option not allowed ",
- "with PERL_FILE_LIST nor PERL_FILE_CODES.\n"
- if $hvAttr->{PERL_FILE_LIST} || $hvAttr->{PERL_FILE_CODES};
- %perlfilecodes= @{$hvAttr->{PERL_FILES}};
- my $odd= 0;
- @perlfiles= grep {$odd= !$odd} @{$hvAttr->{PERL_FILES}};
- } else {
- if( $hvAttr->{PERL_FILE_LIST} ) {
- @perlfiles= @{$hvAttr->{PERL_FILE_LIST}};
- } elsif( $hvAttr->{PERL_FILE_CODES} ) {
- @perlfiles= keys %{$hvAttr->{PERL_FILE_CODES}};
- } else {
- @perlfiles= ( "$module.pm" );
- }
- %perlfilecodes= %{$hvAttr->{PERL_FILE_CODES}}
- if $hvAttr->{PERL_FILE_CODES};
- }
- for my $file ( @perlfiles ) {
- $perlfilecodes{$file}= $perlcode if ! $perlfilecodes{$file};
- }
- if( ! $subroutine ) {
- ; # Don't process any C source code files.
- } elsif( $hvAttr->{C_FILES} ) {
- carp "ExtUtils::Myconst2perl: C_FILES option not allowed ",
- "with C_FILE_LIST nor C_FILE_CODES.\n"
- if $hvAttr->{C_FILE_LIST} || $hvAttr->{C_FILE_CODES};
- %cfilecodes= @{$hvAttr->{C_FILES}};
- my $odd= 0;
- @cfiles= grep {$odd= !$odd} @{$hvAttr->{C_FILES}};
- } else {
- if( $hvAttr->{C_FILE_LIST} ) {
- @cfiles= @{$hvAttr->{C_FILE_LIST}};
- } elsif( $hvAttr->{C_FILE_CODES} ) {
- @cfiles= keys %{$hvAttr->{C_FILE_CODES}};
- } elsif( $writeperl || $cplusplus ) {
- @cfiles= ( "$module.xs" );
- }
- %cfilecodes= %{$hvAttr->{C_FILE_CODES}} if $hvAttr->{C_FILE_CODES};
- }
- for my $file ( @cfiles ) {
- $cfilecodes{$file}= $ccode if ! $cfilecodes{$file};
- }
- for my $key ( keys %$hvRequests ) {
- if( ! $params{$key} ) {
- carp "ExtUtils::Myconst2perl::ParseAttribs: ",
- "Unsupported output ($key).\n";
- } elsif( "SCALAR" eq ref( $params{$key} ) ) {
- ${$hvRequests->{$key}}= ${$params{$key}};
- } elsif( "ARRAY" eq ref( $params{$key} ) ) {
- @{$hvRequests->{$key}}= @{$params{$key}};
- } elsif( "HASH" eq ref( $params{$key} ) ) {
- %{$hvRequests->{$key}}= %{$params{$key}};
- } elsif( "CODE" eq ref( $params{$key} ) ) {
- @{$hvRequests->{$key}}= &{$params{$key}};
- } else {
- die "Impossible value in \$params{$key}";
- }
- }
-}
-
-=item Myconst2perl
-
-Generates a file used to implement C constants as "constant subroutines" in
-a Perl module.
-
-Extracts a list of constants from a module's export list by C<eval>ing the
-first part of the Module's F<*.pm> file and then requesting some groups of
-symbols be exported/imported into a dummy package. Then writes C or C++
-code that can convert each C constant into a Perl "constant subroutine"
-whose name is the constant's name and whose value is the constant's value.
-
-=cut
-
-sub Myconst2perl
-{
- my( $pkg, %spec )= @_;
- my( $outfile, $writeperl, $ifdef, $export, $importto, @importlist,
- @perlfile, %perlcode, @cfile, %ccode, $routine );
- ParseAttribs( $pkg, \%spec, {
- DO_EXPORT => \$export,
- IMPORT_TO => \$importto,
- IMPORT_LIST => \@importlist,
- IFDEF => \$ifdef,
- WRITE_PERL => \$writeperl,
- OUTFILE => \$outfile,
- PERL_FILE_LIST => \@perlfile,
- PERL_FILE_CODES => \%perlcode,
- C_FILE_LIST => \@cfile,
- C_FILE_CODES => \%ccode,
- SUBROUTINE => \$routine,
- } );
- my $module= ( split /::/, $pkg )[-1];
-
- warn "Writing $outfile...\n";
- open( STDOUT, ">$outfile" ) or die "Can't create $outfile: $!\n";
-
- my $code= "";
- my $file;
- foreach $file ( @perlfile ) {
- warn "Reading Perl file, $file: $perlcode{$file}\n";
- open( MODULE, "<$file" ) or die "Can't read Perl file, $file: $!\n";
- eval qq[
- while( <MODULE> ) {
- $perlcode{$file};
- \$code .= \$_;
- }
- 1;
- ] or die "$file eval: $@\n";
- close( MODULE );
- }
-
- print
- "/* $outfile - Generated by ExtUtils::Myconst2perl::Myconst2perl */\n";
- if( $routine ) {
- print "/* See start of $routine() for generation parameters used */\n";
- #print "#define main _main_proto"
- # " /* Ignore Perl's main() prototype */\n\n";
- if( $writeperl ) {
- # Here are more reasons why the WRITE_PERL option is discouraged.
- if( $Config{useperlio} ) {
- print "#define PERLIO_IS_STDIO 1\n";
- }
- print "#define WIN32IO_IS_STDIO 1\n"; # May cause a warning
- print "#define NO_XSLOCKS 1\n"; # What a hack!
- }
- foreach $file ( @cfile ) {
- warn "Reading C file, $file: $ccode{$file}\n";
- open( XS, "<$file" ) or die "Can't read C file, $file: $!\n";
- my $code= $ccode{$file};
- $code =~ s#\\#\\\\#g;
- $code =~ s#([^\s -~])#"\\x".sprintf "%02X",unpack "C",$1#ge;
- $code =~ s#[*]/#*\\/#g;
- print qq[\n/* Include $file: $code */\n];
- print qq[\n#line 1 "$file"\n];
- eval qq[
- while( <XS> ) {
- $ccode{$file};
- print;
- }
- 1;
- ] or die "$file eval: $@\n";
- close( XS );
- }
- #print qq[\n#undef main\n];
- print qq[\n#define CONST2WRITE_PERL\n];
- print qq[\n#include "const2perl.h"\n\n];
- if( $writeperl ) {
- print "int\nmain( int argc, char *argv[], char *envp[] )\n";
- } else {
- print "void\n$routine( void )\n";
- }
- }
- print "{\n";
-
- {
- @ExtUtils::Myconst2perl::importlist= @importlist;
- my $var= '@ExtUtils::Myconst2perl::importlist';
- my $port= $export ? "export" : "import";
- my $arg2= $export ? "q[$importto]," : "";
- local( $^W )= 0;
- eval $code . "{\n"
- . " { package $importto;\n"
- . " warn qq[\u${port}ing to $importto: $var\\n];\n"
- . " \$pkg->$port( $arg2 $var );\n"
- . " }\n"
- . " { no strict 'refs';\n"
- . " $var= sort keys %{'_constants::'}; }\n"
- . " warn 0 + $var, qq[ symbols ${port}ed.\\n];\n"
- . "}\n1;\n"
- or die "eval: $@\n";
- }
- my @syms= @ExtUtils::Myconst2perl::importlist;
-
- my $if;
- my $const;
- print qq[ START_CONSTS( "$pkg" ) /* No ";" */\n];
- {
- my( $head, $tail )= ( "/*", "\n" );
- if( $writeperl ) {
- $head= ' printf( "#';
- $tail= '\\n" );' . "\n";
- print $head, " Generated by $outfile.", $tail;
- }
- print $head, " Package $pkg with options:", $tail;
- $head= " *" if ! $writeperl;
- my $key;
- foreach $key ( sort keys %spec ) {
- my $val= neatvalue($spec{$key});
- $val =~ s/\\/\\\\/g if $writeperl;
- print $head, " $key => ", $val, $tail;
- }
- print $head, " Perl files eval'd:", $tail;
- foreach $key ( @perlfile ) {
- my $code= $perlcode{$key};
- $code =~ s#\\#\\\\#g;
- $code =~ s#([^ -~])#"\\".sprintf "%03o",unpack "C",$1#ge;
- $code =~ s#"#\\"#g if $writeperl;
- print $head, " $key => ", $code, $tail;
- }
- if( $writeperl ) {
- print $head, " C files included:", $tail;
- foreach $key ( @cfile ) {
- my $code= $ccode{$key};
- $code =~ s#\\#\\\\#g;
- $code =~ s#([^ -~])#"\\".sprintf "%03o",unpack "C",$1#ge;
- $code =~ s#"#\\"#g;
- print $head, " $key => ", $code, $tail;
- }
- } else {
- print " */\n";
- }
- }
- if( ! ref($ifdef) && $ifdef =~ /[^\s\w]/ ) {
- my $sub= $ifdef;
- $sub= 'sub { local($_)= @_; ' . $sub . ' }'
- unless $sub =~ /^\s*sub\b/;
- $ifdef= eval $sub;
- die "$@: $sub\n" if $@;
- if( "CODE" ne ref($ifdef) ) {
- die "IFDEF didn't create subroutine reference: eval $sub\n";
- }
- }
- foreach $const ( @syms ) {
- $if= "CODE" eq ref($ifdef) ? $ifdef->($const) : $ifdef;
- if( ! $if ) {
- $if= "";
- } elsif( "1" eq $if ) {
- $if= "#ifdef $const\n";
- } elsif( $if !~ /^#/ ) {
- $if= "#ifdef $if\n";
- } else {
- $if= "$if\n";
- }
- print $if
- . qq[ const2perl( $const );\n];
- if( $if ) {
- print "#else\n"
- . qq[ noconst( $const );\n]
- . "#endif\n";
- }
- }
- if( $writeperl ) {
- print
- qq[ printf( "1;\\n" );\n],
- qq[ return( 0 );\n];
- }
- print "}\n";
-}
-
-1;
diff --git a/win32/ext/Win32API/File/File.pm b/win32/ext/Win32API/File/File.pm
deleted file mode 100644
index 74494fa7ec..0000000000
--- a/win32/ext/Win32API/File/File.pm
+++ /dev/null
@@ -1,3035 +0,0 @@
-# File.pm -- Low-level access to Win32 file/dir functions/constants.
-
-package Win32API::File;
-
-use strict;
-use integer;
-use Carp;
-use Config qw( %Config );
-use Fcntl qw( O_RDONLY O_RDWR O_WRONLY O_APPEND O_BINARY O_TEXT );
-use vars qw( $VERSION @ISA );
-use vars qw( @EXPORT @EXPORT_OK @EXPORT_FAIL %EXPORT_TAGS );
-
-$VERSION= '0.1001';
-
-use base qw( Exporter DynaLoader Tie::Handle IO::File );
-
-# Math::BigInt optimizations courtesy of Tels
-BEGIN {
- require Math::BigInt;
- if (defined($Math::BigInt::VERSION) && $Math::BigInt::VERSION >= 1.60) {
- Math::BigInt->import(lib => 'GMP');
- }
-}
-
-my $_64BITINT = defined $Config{use64bitint} &&
- $Config{use64bitint} eq 'define';
-
-my $THIRTY_TWO = $_64BITINT ? 32 : new Math::BigInt 32;
-
-my $FFFFFFFF = $_64BITINT ? 0xFFFFFFFF : new Math::BigInt 0xFFFFFFFF;
-
-@EXPORT= qw();
-%EXPORT_TAGS= (
- Func => [qw( attrLetsToBits createFile
- fileConstant fileLastError getLogicalDrives
- CloseHandle CopyFile CreateFile
- DefineDosDevice DeleteFile DeviceIoControl
- FdGetOsFHandle GetDriveType GetFileAttributes GetFileType
- GetHandleInformation GetLogicalDrives GetLogicalDriveStrings
- GetOsFHandle GetVolumeInformation IsRecognizedPartition
- IsContainerPartition MoveFile MoveFileEx
- OsFHandleOpen OsFHandleOpenFd QueryDosDevice
- ReadFile SetErrorMode SetFilePointer
- SetHandleInformation WriteFile GetFileSize
- getFileSize setFilePointer GetOverlappedResult)],
- FuncA => [qw(
- CopyFileA CreateFileA DefineDosDeviceA
- DeleteFileA GetDriveTypeA GetFileAttributesA GetLogicalDriveStringsA
- GetVolumeInformationA MoveFileA MoveFileExA
- QueryDosDeviceA )],
- FuncW => [qw(
- CopyFileW CreateFileW DefineDosDeviceW
- DeleteFileW GetDriveTypeW GetFileAttributesW GetLogicalDriveStringsW
- GetVolumeInformationW MoveFileW MoveFileExW
- QueryDosDeviceW )],
- Misc => [qw(
- CREATE_ALWAYS CREATE_NEW FILE_BEGIN
- FILE_CURRENT FILE_END INVALID_HANDLE_VALUE
- OPEN_ALWAYS OPEN_EXISTING TRUNCATE_EXISTING )],
- DDD_ => [qw(
- DDD_EXACT_MATCH_ON_REMOVE DDD_RAW_TARGET_PATH
- DDD_REMOVE_DEFINITION )],
- DRIVE_ => [qw(
- DRIVE_UNKNOWN DRIVE_NO_ROOT_DIR DRIVE_REMOVABLE
- DRIVE_FIXED DRIVE_REMOTE DRIVE_CDROM
- DRIVE_RAMDISK )],
- FILE_ => [qw(
- FILE_READ_DATA FILE_LIST_DIRECTORY
- FILE_WRITE_DATA FILE_ADD_FILE
- FILE_APPEND_DATA FILE_ADD_SUBDIRECTORY
- FILE_CREATE_PIPE_INSTANCE FILE_READ_EA
- FILE_WRITE_EA FILE_EXECUTE
- FILE_TRAVERSE FILE_DELETE_CHILD
- FILE_READ_ATTRIBUTES FILE_WRITE_ATTRIBUTES
- FILE_ALL_ACCESS FILE_GENERIC_READ
- FILE_GENERIC_WRITE FILE_GENERIC_EXECUTE )],
- FILE_ATTRIBUTE_ => [qw(
- INVALID_FILE_ATTRIBUTES
- FILE_ATTRIBUTE_DEVICE FILE_ATTRIBUTE_DIRECTORY
- FILE_ATTRIBUTE_ENCRYPTED FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
- FILE_ATTRIBUTE_REPARSE_POINT FILE_ATTRIBUTE_SPARSE_FILE
- FILE_ATTRIBUTE_ARCHIVE FILE_ATTRIBUTE_COMPRESSED
- FILE_ATTRIBUTE_HIDDEN FILE_ATTRIBUTE_NORMAL
- FILE_ATTRIBUTE_OFFLINE FILE_ATTRIBUTE_READONLY
- FILE_ATTRIBUTE_SYSTEM FILE_ATTRIBUTE_TEMPORARY )],
- FILE_FLAG_ => [qw(
- FILE_FLAG_BACKUP_SEMANTICS FILE_FLAG_DELETE_ON_CLOSE
- FILE_FLAG_NO_BUFFERING FILE_FLAG_OVERLAPPED
- FILE_FLAG_POSIX_SEMANTICS FILE_FLAG_RANDOM_ACCESS
- FILE_FLAG_SEQUENTIAL_SCAN FILE_FLAG_WRITE_THROUGH
- FILE_FLAG_OPEN_REPARSE_POINT )],
- FILE_SHARE_ => [qw(
- FILE_SHARE_DELETE FILE_SHARE_READ FILE_SHARE_WRITE )],
- FILE_TYPE_ => [qw(
- FILE_TYPE_CHAR FILE_TYPE_DISK FILE_TYPE_PIPE
- FILE_TYPE_UNKNOWN )],
- FS_ => [qw(
- FS_CASE_IS_PRESERVED FS_CASE_SENSITIVE
- FS_UNICODE_STORED_ON_DISK FS_PERSISTENT_ACLS
- FS_FILE_COMPRESSION FS_VOL_IS_COMPRESSED )],
- FSCTL_ => [qw(
- FSCTL_SET_REPARSE_POINT FSCTL_GET_REPARSE_POINT
- FSCTL_DELETE_REPARSE_POINT )],
- HANDLE_FLAG_ => [qw(
- HANDLE_FLAG_INHERIT HANDLE_FLAG_PROTECT_FROM_CLOSE )],
- IOCTL_STORAGE_ => [qw(
- IOCTL_STORAGE_CHECK_VERIFY IOCTL_STORAGE_MEDIA_REMOVAL
- IOCTL_STORAGE_EJECT_MEDIA IOCTL_STORAGE_LOAD_MEDIA
- IOCTL_STORAGE_RESERVE IOCTL_STORAGE_RELEASE
- IOCTL_STORAGE_FIND_NEW_DEVICES IOCTL_STORAGE_GET_MEDIA_TYPES
- )],
- IOCTL_DISK_ => [qw(
- IOCTL_DISK_FORMAT_TRACKS IOCTL_DISK_FORMAT_TRACKS_EX
- IOCTL_DISK_GET_DRIVE_GEOMETRY IOCTL_DISK_GET_DRIVE_LAYOUT
- IOCTL_DISK_GET_MEDIA_TYPES IOCTL_DISK_GET_PARTITION_INFO
- IOCTL_DISK_HISTOGRAM_DATA IOCTL_DISK_HISTOGRAM_RESET
- IOCTL_DISK_HISTOGRAM_STRUCTURE IOCTL_DISK_IS_WRITABLE
- IOCTL_DISK_LOGGING IOCTL_DISK_PERFORMANCE
- IOCTL_DISK_REASSIGN_BLOCKS IOCTL_DISK_REQUEST_DATA
- IOCTL_DISK_REQUEST_STRUCTURE IOCTL_DISK_SET_DRIVE_LAYOUT
- IOCTL_DISK_SET_PARTITION_INFO IOCTL_DISK_VERIFY )],
- GENERIC_ => [qw(
- GENERIC_ALL GENERIC_EXECUTE
- GENERIC_READ GENERIC_WRITE )],
- MEDIA_TYPE => [qw(
- Unknown F5_1Pt2_512 F3_1Pt44_512
- F3_2Pt88_512 F3_20Pt8_512 F3_720_512
- F5_360_512 F5_320_512 F5_320_1024
- F5_180_512 F5_160_512 RemovableMedia
- FixedMedia F3_120M_512 )],
- MOVEFILE_ => [qw(
- MOVEFILE_COPY_ALLOWED MOVEFILE_DELAY_UNTIL_REBOOT
- MOVEFILE_REPLACE_EXISTING MOVEFILE_WRITE_THROUGH )],
- SECURITY_ => [qw(
- SECURITY_ANONYMOUS SECURITY_CONTEXT_TRACKING
- SECURITY_DELEGATION SECURITY_EFFECTIVE_ONLY
- SECURITY_IDENTIFICATION SECURITY_IMPERSONATION
- SECURITY_SQOS_PRESENT )],
- SEM_ => [qw(
- SEM_FAILCRITICALERRORS SEM_NOGPFAULTERRORBOX
- SEM_NOALIGNMENTFAULTEXCEPT SEM_NOOPENFILEERRORBOX )],
- PARTITION_ => [qw(
- PARTITION_ENTRY_UNUSED PARTITION_FAT_12
- PARTITION_XENIX_1 PARTITION_XENIX_2
- PARTITION_FAT_16 PARTITION_EXTENDED
- PARTITION_HUGE PARTITION_IFS
- PARTITION_FAT32 PARTITION_FAT32_XINT13
- PARTITION_XINT13 PARTITION_XINT13_EXTENDED
- PARTITION_PREP PARTITION_UNIX
- VALID_NTFT PARTITION_NTFT )],
-);
-@EXPORT_OK= ();
-{
- my $key;
- foreach $key ( keys(%EXPORT_TAGS) ) {
- push( @EXPORT_OK, @{$EXPORT_TAGS{$key}} );
- #push( @EXPORT_FAIL, @{$EXPORT_TAGS{$key}} ) unless $key =~ /^Func/;
- }
-}
-$EXPORT_TAGS{ALL}= \@EXPORT_OK;
-
-bootstrap Win32API::File $VERSION;
-
-# Preloaded methods go here.
-
-# To convert C constants to Perl code in cFile.pc
-# [instead of C or C++ code in cFile.h]:
-# * Modify F<Makefile.PL> to add WriteMakeFile() =>
-# CONST2PERL/postamble => [[ "Win32API::File" => ]] WRITE_PERL => 1.
-# * Either comment out C<#include "cFile.h"> from F<File.xs>
-# or make F<cFile.h> an empty file.
-# * Make sure the following C<if> block is not commented out.
-# * "nmake clean", "perl Makefile.PL", "nmake"
-
-if( ! defined &GENERIC_READ ) {
- require "Win32API/File/cFile.pc";
-}
-
-sub fileConstant
-{
- my( $name )= @_;
- if( 1 != @_ || ! $name || $name =~ /\W/ ) {
- require Carp;
- Carp::croak( 'Usage: ',__PACKAGE__,'::fileConstant("CONST_NAME")' );
- }
- my $proto= prototype $name;
- if( defined \&$name
- && defined $proto
- && "" eq $proto ) {
- no strict 'refs';
- return &$name;
- }
- return undef;
-}
-
-# We provide this for backwards compatibility:
-sub constant
-{
- my( $name )= @_;
- my $value= fileConstant( $name );
- if( defined $value ) {
- $!= 0;
- return $value;
- }
- $!= 11; # EINVAL
- return 0;
-}
-
-# BEGIN {
-# my $code= 'return _fileLastError(@_)';
-# local( $!, $^E )= ( 1, 1 );
-# if( $! ne $^E ) {
-# $code= '
-# local( $^E )= _fileLastError(@_);
-# my $ret= $^E;
-# return $ret;
-# ';
-# }
-# eval "sub fileLastError { $code }";
-# die "$@" if $@;
-# }
-
-package Win32API::File::_error;
-
-use overload
- '""' => sub {
- require Win32 unless defined &Win32::FormatMessage;
- $_ = Win32::FormatMessage(Win32API::File::_fileLastError());
- tr/\r\n//d;
- return $_;
- },
- '0+' => sub { Win32API::File::_fileLastError() },
- 'fallback' => 1;
-
-sub new { return bless {}, shift }
-sub set { Win32API::File::_fileLastError($_[1]); return $_[0] }
-
-package Win32API::File;
-
-my $_error = new Win32API::File::_error;
-
-sub fileLastError {
- croak 'Usage: ',__PACKAGE__,'::fileLastError( [$setWin32ErrCode] )' if @_ > 1;
- $_error->set($_[0]) if defined $_[0];
- return $_error;
-}
-
-# Since we ISA DynaLoader which ISA AutoLoader, we ISA AutoLoader so we
-# need this next chunk to prevent Win32API::File->nonesuch() from
-# looking for "nonesuch.al" and producing confusing error messages:
-use vars qw($AUTOLOAD);
-sub AUTOLOAD {
- require Carp;
- Carp::croak(
- "Can't locate method $AUTOLOAD via package Win32API::File" );
-}
-
-# Replace "&rout;" with "goto &rout;" when that is supported on Win32.
-
-# Aliases for non-Unicode functions:
-sub CopyFile { &CopyFileA; }
-sub CreateFile { &CreateFileA; }
-sub DefineDosDevice { &DefineDosDeviceA; }
-sub DeleteFile { &DeleteFileA; }
-sub GetDriveType { &GetDriveTypeA; }
-sub GetFileAttributes { &GetFileAttributesA; }
-sub GetLogicalDriveStrings { &GetLogicalDriveStringsA; }
-sub GetVolumeInformation { &GetVolumeInformationA; }
-sub MoveFile { &MoveFileA; }
-sub MoveFileEx { &MoveFileExA; }
-sub QueryDosDevice { &QueryDosDeviceA; }
-
-sub OsFHandleOpen {
- if( 3 != @_ ) {
- croak 'Win32API::File Usage: ',
- 'OsFHandleOpen(FILE,$hNativeHandle,"rwatb")';
- }
- my( $fh, $osfh, $access )= @_;
- if( ! ref($fh) ) {
- if( $fh !~ /('|::)/ ) {
- $fh= caller() . "::" . $fh;
- }
- no strict "refs";
- $fh= \*{$fh};
- }
- my( $mode, $pref );
- if( $access =~ /r/i ) {
- if( $access =~ /w/i ) {
- $mode= O_RDWR;
- $pref= "+<";
- } else {
- $mode= O_RDONLY;
- $pref= "<";
- }
- } else {
- if( $access =~ /w/i ) {
- $mode= O_WRONLY;
- $pref= ">";
- } else {
- # croak qq<Win32API::File::OsFHandleOpen(): >,
- # qq<Access ($access) missing both "r" and "w">;
- $mode= O_RDONLY;
- $pref= "<";
- }
- }
- $mode |= O_APPEND if $access =~ /a/i;
- #$mode |= O_TEXT if $access =~ /t/i;
- # Some versions of the Fcntl module are broken and won't autoload O_TEXT:
- if( $access =~ /t/i ) {
- my $o_text= eval "O_TEXT";
- $o_text= 0x4000 if $@;
- $mode |= $o_text;
- }
- $mode |= O_BINARY if $access =~ /b/i;
- my $fd = eval { OsFHandleOpenFd( $osfh, $mode ) };
- if ($@) {
- return tie *{$fh}, __PACKAGE__, $osfh;
- }
- return undef if $fd < 0;
- return open( $fh, $pref."&=".$fd );
-}
-
-sub GetOsFHandle {
- if( 1 != @_ ) {
- croak 'Win32API::File Usage: $OsFHandle= GetOsFHandle(FILE)';
- }
- my( $file )= @_;
- if( ! ref($file) ) {
- if( $file !~ /('|::)/ ) {
- $file= caller() . "::" . $file;
- }
- no strict "refs";
- # The eval "" is necessary in Perl 5.6, avoid it otherwise.
- my $tied = !defined($^]) || $^] < 5.008
- ? eval "tied *{$file}"
- : tied *{$file};
-
- if (UNIVERSAL::isa($tied => __PACKAGE__)) {
- return $tied->win32_handle;
- }
-
- $file= *{$file};
- }
- my( $fd )= fileno($file);
- if( ! defined( $fd ) ) {
- if( $file =~ /^\d+\Z/ ) {
- $fd= $file;
- } else {
- return (); # $! should be set by fileno().
- }
- }
- my $h= FdGetOsFHandle( $fd );
- if( INVALID_HANDLE_VALUE() == $h ) {
- $h= "";
- } elsif( "0" eq $h ) {
- $h= "0 but true";
- }
- return $h;
-}
-
-sub getFileSize {
- croak 'Win32API::File Usage: $size= getFileSize($hNativeHandle)'
- if @_ != 1;
-
- my $handle = shift;
- my $high_size = 0;
-
- my $low_size = GetFileSize($handle, $high_size);
-
- my $retval = $_64BITINT ? $high_size : new Math::BigInt $high_size;
-
- $retval <<= $THIRTY_TWO;
- $retval += $low_size;
-
- return $retval;
-}
-
-sub setFilePointer {
- croak 'Win32API::File Usage: $pos= setFilePointer($hNativeHandle, $posl, $from_where)'
- if @_ != 3;
-
- my ($handle, $pos, $from_where) = @_;
-
- my ($pos_low, $pos_high) = ($pos, 0);
-
- if ($_64BITINT) {
- $pos_low = ($pos & $FFFFFFFF);
- $pos_high = (($pos >> $THIRTY_TWO) & $FFFFFFFF);
- }
- elsif (UNIVERSAL::isa($pos => 'Math::BigInt')) {
- $pos_low = ($pos & $FFFFFFFF)->numify();
- $pos_high = (($pos >> $THIRTY_TWO) & $FFFFFFFF)->numify();
- }
-
- my $retval = SetFilePointer($handle, $pos_low, $pos_high, $from_where);
-
- if (defined $pos_high && $pos_high != 0) {
- $retval = new Math::BigInt $retval unless $_64BITINT;
- $pos_high = new Math::BigInt $pos_high unless $_64BITINT;
-
- $retval += $pos_high << $THIRTY_TWO;
- }
-
- return $retval;
-}
-
-sub attrLetsToBits
-{
- my( $lets )= @_;
- my( %a )= (
- "a"=>FILE_ATTRIBUTE_ARCHIVE(), "c"=>FILE_ATTRIBUTE_COMPRESSED(),
- "h"=>FILE_ATTRIBUTE_HIDDEN(), "o"=>FILE_ATTRIBUTE_OFFLINE(),
- "r"=>FILE_ATTRIBUTE_READONLY(), "s"=>FILE_ATTRIBUTE_SYSTEM(),
- "t"=>FILE_ATTRIBUTE_TEMPORARY() );
- my( $bits )= 0;
- foreach( split(//,$lets) ) {
- croak "Win32API::File::attrLetsToBits: Unknown attribute letter ($_)"
- unless exists $a{$_};
- $bits |= $a{$_};
- }
- return $bits;
-}
-
-use vars qw( @_createFile_Opts %_createFile_Opts );
-@_createFile_Opts= qw( Access Create Share Attributes
- Flags Security Model );
-@_createFile_Opts{@_createFile_Opts}= (1) x @_createFile_Opts;
-
-sub createFile
-{
- my $opts= "";
- if( 2 <= @_ && "HASH" eq ref($_[$#_]) ) {
- $opts= pop( @_ );
- }
- my( $sPath, $svAccess, $svShare )= @_;
- if( @_ < 1 || 3 < @_ ) {
- croak "Win32API::File::createFile() usage: \$hObject= createFile(\n",
- " \$sPath, [\$svAccess_qrw_ktn_ce,[\$svShare_rwd,]]",
- " [{Option=>\$Value}] )\n",
- " options: @_createFile_Opts\nCalled";
- }
- my( $create, $flags, $sec, $model )= ( "", 0, [], 0 );
- if( ref($opts) ) {
- my @err= grep( ! $_createFile_Opts{$_}, keys(%$opts) );
- @err and croak "_createFile: Invalid options (@err)";
- $flags= $opts->{Flags} if exists( $opts->{Flags} );
- $flags |= attrLetsToBits( $opts->{Attributes} )
- if exists( $opts->{Attributes} );
- $sec= $opts->{Security} if exists( $opts->{Security} );
- $model= $opts->{Model} if exists( $opts->{Model} );
- $svAccess= $opts->{Access} if exists( $opts->{Access} );
- $create= $opts->{Create} if exists( $opts->{Create} );
- $svShare= $opts->{Share} if exists( $opts->{Share} );
- }
- $svAccess= "r" unless defined($svAccess);
- $svShare= "rw" unless defined($svShare);
- if( $svAccess =~ /^[qrw ktn ce]*$/i ) {
- ( my $c= $svAccess ) =~ tr/qrw QRW//d;
- $create= $c if "" ne $c && "" eq $create;
- local( $_ )= $svAccess;
- $svAccess= 0;
- $svAccess |= GENERIC_READ() if /r/i;
- $svAccess |= GENERIC_WRITE() if /w/i;
- } elsif( "?" eq $svAccess ) {
- croak
- "Win32API::File::createFile: \$svAccess can use the following:\n",
- " One or more of the following:\n",
- "\tq -- Query access (same as 0)\n",
- "\tr -- Read access (GENERIC_READ)\n",
- "\tw -- Write access (GENERIC_WRITE)\n",
- " At most one of the following:\n",
- "\tk -- Keep if exists\n",
- "\tt -- Truncate if exists\n",
- "\tn -- New file only (fail if file already exists)\n",
- " At most one of the following:\n",
- "\tc -- Create if doesn't exist\n",
- "\te -- Existing file only (fail if doesn't exist)\n",
- " '' is the same as 'q k e'\n",
- " 'r' is the same as 'r k e'\n",
- " 'w' is the same as 'w t c'\n",
- " 'rw' is the same as 'rw k c'\n",
- " 'rt' or 'rn' implies 'c'.\n",
- " Or \$svAccess can be numeric.\n", "Called from";
- } elsif( $svAccess == 0 && $svAccess !~ /^[-+.]*0/ ) {
- croak "Win32API::File::createFile: Invalid \$svAccess ($svAccess)";
- }
- if( $create =~ /^[ktn ce]*$/ ) {
- local( $_ )= $create;
- my( $k, $t, $n, $c, $e )= ( scalar(/k/i), scalar(/t/i),
- scalar(/n/i), scalar(/c/i), scalar(/e/i) );
- if( 1 < $k + $t + $n ) {
- croak "Win32API::File::createFile: \$create must not use ",
- qq<more than one of "k", "t", and "n" ($create)>;
- }
- if( $c && $e ) {
- croak "Win32API::File::createFile: \$create must not use ",
- qq<both "c" and "e" ($create)>;
- }
- my $r= ( $svAccess & GENERIC_READ() ) == GENERIC_READ();
- my $w= ( $svAccess & GENERIC_WRITE() ) == GENERIC_WRITE();
- if( ! $k && ! $t && ! $n ) {
- if( $w && ! $r ) { $t= 1;
- } else { $k= 1; }
- }
- if( $k ) {
- if( $c || $w && ! $e ) { $create= OPEN_ALWAYS();
- } else { $create= OPEN_EXISTING(); }
- } elsif( $t ) {
- if( $e ) { $create= TRUNCATE_EXISTING();
- } else { $create= CREATE_ALWAYS(); }
- } else { # $n
- if( ! $e ) { $create= CREATE_NEW();
- } else {
- croak "Win32API::File::createFile: \$create must not use ",
- qq<both "n" and "e" ($create)>;
- }
- }
- } elsif( "?" eq $create ) {
- croak 'Win32API::File::createFile: $create !~ /^[ktn ce]*$/;',
- ' pass $svAccess as "?" for more information.';
- } elsif( $create == 0 && $create ne "0" ) {
- croak "Win32API::File::createFile: Invalid \$create ($create)";
- }
- if( $svShare =~ /^[drw]*$/ ) {
- my %s= ( "d"=>FILE_SHARE_DELETE(), "r"=>FILE_SHARE_READ(),
- "w"=>FILE_SHARE_WRITE() );
- my @s= split(//,$svShare);
- $svShare= 0;
- foreach( @s ) {
- $svShare |= $s{$_};
- }
- } elsif( $svShare == 0 && $svShare !~ /^[-+.]*0/ ) {
- croak "Win32API::File::createFile: Invalid \$svShare ($svShare)";
- }
- return CreateFileA(
- $sPath, $svAccess, $svShare, $sec, $create, $flags, $model );
-}
-
-
-sub getLogicalDrives
-{
- my( $ref )= @_;
- my $s= "";
- if( ! GetLogicalDriveStringsA( 256, $s ) ) {
- return undef;
- }
- if( ! defined($ref) ) {
- return split( /\0/, $s );
- } elsif( "ARRAY" ne ref($ref) ) {
- croak 'Usage: C<@arr= getLogicalDrives()> ',
- 'or C<getLogicalDrives(\\@arr)>', "\n";
- }
- @$ref= split( /\0/, $s );
- return $ref;
-}
-
-###############################################################################
-# Experimental Tied Handle and Object Oriented interface. #
-###############################################################################
-
-sub new {
- my $class = shift;
- $class = ref $class || $class;
-
- my $self = IO::File::new($class);
- tie *$self, __PACKAGE__;
-
- $self->open(@_) if @_;
-
- return $self;
-}
-
-sub TIEHANDLE {
- my ($class, $win32_handle) = @_;
- $class = ref $class || $class;
-
- return bless {
- _win32_handle => $win32_handle,
- _binmode => 0,
- _buffered => 0,
- _buffer => '',
- _eof => 0,
- _fileno => undef,
- _access => 'r',
- _append => 0,
- }, $class;
-}
-
-# This is called for getting the tied object from hard refs to glob refs in
-# some cases, for reasons I don't quite grok.
-
-sub FETCH { return $_[0] }
-
-# Public accessors
-
-sub win32_handle{ $_[0]->{_win32_handle}||= $_[1] }
-
-# Protected accessors
-
-sub _buffer { $_[0]->{_buffer} ||= $_[1] }
-sub _binmode { $_[0]->{_binmode} ||= $_[1] }
-sub _fileno { $_[0]->{_fileno} ||= $_[1] }
-sub _access { $_[0]->{_access} ||= $_[1] }
-sub _append { $_[0]->{_append} ||= $_[1] }
-
-# Tie interface
-
-sub OPEN {
- my $self = shift;
- my $expr = shift;
- croak "Only the two argument form of open is supported at this time" if @_;
-# FIXME: this needs to parse the full Perl open syntax in $expr
-
- my ($mixed, $mode, $path) =
- ($expr =~ /^\s* (\+)? \s* (<|>|>>)? \s* (.*?) \s*$/x);
-
- croak "Unsupported open mode" if not $path;
-
- my $access = 'r';
- my $append = $mode eq '>>' ? 1 : 0;
-
- if ($mixed) {
- $access = 'rw';
- } elsif($mode eq '>') {
- $access = 'w';
- }
-
- my $w32_handle = createFile($path, $access);
-
- $self->win32_handle($w32_handle);
-
- $self->seek(1,2) if $append;
-
- $self->_access($access);
- $self->_append($append);
-
- return 1;
-}
-
-sub BINMODE {
- $_[0]->_binmode(1);
-}
-
-sub WRITE {
- my ($self, $buf, $len, $offset, $overlap) = @_;
-
- if ($offset) {
- $buf = substr($buf, $offset);
- $len = length($buf);
- }
-
- $len = length($buf) if not defined $len;
-
- $overlap = [] if not defined $overlap;;
-
- my $bytes_written = 0;
-
- WriteFile (
- $self->win32_handle, $buf, $len,
- $bytes_written, $overlap
- );
-
- return $bytes_written;
-}
-
-sub PRINT {
- my $self = shift;
-
- my $buf = join defined $, ? $, : "" => @_;
-
- $buf =~ s/\012/\015\012/sg unless $self->_binmode();
-
- $buf .= $\ if defined $\;
-
- $self->WRITE($buf, length($buf), 0);
-}
-
-sub READ {
- my $self = shift;
- my $into = \$_[0]; shift;
- my ($len, $offset, $overlap) = @_;
-
- my $buffer = defined $self->_buffer ? $self->_buffer : "";
- my $buf_length = length($buffer);
- my $bytes_read = 0;
- my $data;
- $offset = 0 if not defined $offset;
-
- if ($buf_length >= $len) {
- $data = substr($buffer, 0, $len => "");
- $bytes_read = $len;
- $self->_buffer($buffer);
- } else {
- if ($buf_length > 0) {
- $len -= $buf_length;
- substr($$into, $offset) = $buffer;
- $offset += $buf_length;
- }
-
- $overlap ||= [];
-
- ReadFile (
- $self->win32_handle, $data, $len,
- $bytes_read, $overlap
- );
- }
-
- $$into = "" if not defined $$into;
-
- substr($$into, $offset) = $data;
-
- return $bytes_read;
-}
-
-sub READLINE {
- my $self = shift;
- my $line = "";
-
- while ((index $line, $/) == $[-1) { # read until end of line marker
- my $char = $self->GETC();
-
- last if !defined $char || $char eq '';
-
- $line .= $char;
- }
-
- return undef if $line eq '';
-
- return $line;
-}
-
-
-sub FILENO {
- my $self = shift;
-
- return $self->_fileno() if defined $self->_fileno();
-
- return -1 if $^O eq 'cygwin';
-
-# FIXME: We don't always open the handle, better to query the handle or to set
-# the right access info at TIEHANDLE time.
-
- my $access = $self->_access();
- my $mode = $access eq 'rw' ? O_RDWR :
- $access eq 'w' ? O_WRONLY : O_RDONLY;
-
- $mode |= O_APPEND if $self->_append();
-
- $mode |= O_TEXT if not $self->_binmode();
-
- return $self->_fileno ( OsfHandleOpenFd (
- $self->win32_handle, $mode
- ));
-}
-
-sub SEEK {
- my ($self, $pos, $whence) = @_;
-
- $whence = 0 if not defined $whence;
- my @file_consts = map {
- fileConstant($_)
- } qw(FILE_BEGIN FILE_CURRENT FILE_END);
-
- my $from_where = $file_consts[$whence];
-
- return setFilePointer($self->win32_handle, $pos, $from_where);
-}
-
-sub TELL {
-# SetFilePointer with position 0 at FILE_CURRENT will return position.
- return $_[0]->SEEK(0, 1);
-}
-
-sub EOF {
- my $self = shift;
-
- my $current = $self->TELL() + 0;
- my $end = getFileSize($self->win32_handle) + 0;
-
- return $current == $end;
-}
-
-sub CLOSE {
- my $self = shift;
-
- my $retval = 1;
-
- if (defined $self->win32_handle) {
- $retval = CloseHandle($self->win32_handle);
-
- $self->win32_handle(undef);
- }
-
- return $retval;
-}
-
-# Only close the handle on explicit close, too many problems otherwise.
-sub UNTIE {}
-
-sub DESTROY {}
-
-# End of Tie/OO Interface
-
-# Autoload methods go after =cut, and are processed by the autosplit program.
-
-1;
-__END__
-
-=head1 NAME
-
-Win32API::File - Low-level access to Win32 system API calls for files/dirs.
-
-=head1 SYNOPSIS
-
- use Win32API::File 0.08 qw( :ALL );
-
- MoveFile( $Source, $Destination )
- or die "Can't move $Source to $Destination: ",fileLastError(),"\n";
- MoveFileEx( $Source, $Destination, MOVEFILE_REPLACE_EXISTING() )
- or die "Can't move $Source to $Destination: ",fileLastError(),"\n";
- [...]
-
-=head1 DESCRIPTION
-
-This provides fairly low-level access to the Win32 System API
-calls dealing with files and directories.
-
-To pass in C<NULL> as the pointer to an optional buffer, pass in
-an empty list reference, C<[]>.
-
-Beyond raw access to the API calls and related constants, this module
-handles smart buffer allocation and translation of return codes.
-
-All functions, unless otherwise noted, return a true value for success
-and a false value for failure and set C<$^E> on failure.
-
-=head2 Object Oriented/Tied Handle Interface
-
-WARNING: this is new code, use at your own risk.
-
-This version of C<Win32API::File> can be used like an C<IO::File> object:
-
- my $file = new Win32API::File "+> foo";
- binmode $file;
- print $file "hello there\n";
- seek $file, 0, 0;
- my $line = <$file>;
- $file->close;
-
-It also supports tying via a win32 handle (for example, from C<createFile()>):
-
- tie FILE, 'Win32API::File', $win32_handle;
- print FILE "...";
-
-It has not been extensively tested yet and buffered I/O is not yet implemented.
-
-=head2 Exports
-
-Nothing is exported by default. The following tags can be used to
-have large sets of symbols exported: C<":Func">, C<":FuncA">,
-C<":FuncW">, C<":Misc">, C<":DDD_">, C<":DRIVE_">, C<":FILE_">,
-C<":FILE_ATTRIBUTE_">, C<":FILE_FLAG_">, C<":FILE_SHARE_">,
-C<":FILE_TYPE_">, C<":FS_">, C<":FSCTL_">, C<":HANDLE_FLAG_">,
-C<":IOCTL_STORAGE_">, C<":IOCTL_DISK_">, C<":GENERIC_">,
-C<":MEDIA_TYPE">, C<":MOVEFILE_">, C<":SECURITY_">, C<":SEM_">,
-and C<":PARTITION_">.
-
-=over
-
-=item C<":Func">
-
-The basic function names: C<attrLetsToBits>, C<createFile>,
-C<fileConstant>, C<fileLastError>, C<getLogicalDrives>,
-C<setFilePointer>, C<getFileSize>,
-C<CloseHandle>, C<CopyFile>, C<CreateFile>,
-C<DefineDosDevice>, C<DeleteFile>, C<DeviceIoControl>,
-C<FdGetOsFHandle>, C<GetDriveType>, C<GetFileAttributes>,
-C<GetFileSize>, C<GetFileType>, C<GetHandleInformation>,
-C<GetLogicalDrives>, C<GetLogicalDriveStrings>, C<GetOsFHandle>,
-C<GetOverlappedResult>, C<GetVolumeInformation>, C<IsContainerPartition>,
-C<IsRecognizedPartition>, C<MoveFile>, C<MoveFileEx>,
-C<OsFHandleOpen>, C<OsFHandleOpenFd>, C<QueryDosDevice>,
-C<ReadFile>, C<SetErrorMode>, C<SetFilePointer>,
-C<SetHandleInformation>, and C<WriteFile>.
-
-=over
-
-=item attrLetsToBits
-
-=item C<$uBits= attrLetsToBits( $sAttributeLetters )>
-
-Converts a string of file attribute letters into an unsigned value with
-the corresponding bits set. C<$sAttributeLetters> should contain zero
-or more letters from C<"achorst">:
-
-=over
-
-=item C<"a">
-
-C<FILE_ATTRIBUTE_ARCHIVE>
-
-=item C<"c">
-
-C<FILE_ATTRIBUTE_COMPRESSED>
-
-=item C<"h">
-
-C<FILE_ATTRIBUTE_HIDDEN>
-
-=item C<"o">
-
-C<FILE_ATTRIBUTE_OFFLINE>
-
-=item C<"r">
-
-C<FILE_ATTRIBUTE_READONLY>
-
-=item C<"s">
-
-C<FILE_ATTRIBUTE_SYSTEM>
-
-=item C<"t">
-
-C<FILE_ATTRIBUTE_TEMPORARY>
-
-=back
-
-=item createFile
-
-=item C<$hObject= createFile( $sPath )>
-
-=item C<$hObject= createFile( $sPath, $rvhvOptions )>
-
-=item C<$hObject= createFile( $sPath, $svAccess )>
-
-=item C<$hObject= createFile( $sPath, $svAccess, $rvhvOptions )>
-
-=item C<$hObject= createFile( $sPath, $svAccess, $svShare )>
-
-=item C<$hObject= createFile( $sPath, $svAccess, $svShare, $rvhvOptions )>
-
-This is a Perl-friendly wrapper around C<CreateFile>.
-
-On failure, C<$hObject> gets set to a false value and C<regLastError()>
-and C<$^E> are set to the reason for the failure. Otherwise,
-C<$hObject> gets set to a Win32 native file handle which is alwasy
-a true value [returns C<"0 but true"> in the impossible(?) case of
-the handle having a value of C<0>].
-
-C<$sPath> is the path to the file [or device, etc.] to be opened. See
-C<CreateFile> for more information on possible special values for
-C<$sPath>.
-
-C<$svAccess> can be a number containing the bit mask representing
-the specific type(s) of access to the file that you desire. See the
-C<$uAccess> parameter to C<CreateFile> for more information on these
-values.
-
-More likely, C<$svAccess> is a string describing the generic type of
-access you desire and possibly the file creation options to use. In
-this case, C<$svAccess> should contain zero or more characters from
-C<"qrw"> [access desired], zero or one character each from C<"ktn">
-and C<"ce">, and optional white space. These letters stand for,
-respectively, "Query access", "Read access", "Write access", "Keep if
-exists", "Truncate if exists", "New file only", "Create if none", and
-"Existing file only". Case is ignored.
-
-You can pass in C<"?"> for C<$svAccess> to have an error message
-displayed summarizing its possible values. This is very handy when
-doing on-the-fly programming using the Perl debugger:
-
- Win32API::File::createFile: $svAccess can use the following:
- One or more of the following:
- q -- Query access (same as 0)
- r -- Read access (GENERIC_READ)
- w -- Write access (GENERIC_WRITE)
- At most one of the following:
- k -- Keep if exists
- t -- Truncate if exists
- n -- New file only (fail if file already exists)
- At most one of the following:
- c -- Create if doesn't exist
- e -- Existing file only (fail if doesn't exist)
- '' is the same as 'q k e'
- 'r' is the same as 'r k e'
- 'w' is the same as 'w t c'
- 'rw' is the same as 'rw k c'
- 'rt' or 'rn' implies 'c'.
- Or $access can be numeric.
-
-C<$svAccess> is designed to be "do what I mean", so you can skip
-the rest of its explanation unless you are interested in the complex
-details. Note that, if you want write access to a device, you need
-to specify C<"k"> [and perhaps C<"e">, as in C<"w ke"> or C<"rw ke">]
-since Win32 suggests C<OPEN_EXISTING> be used when opening a device.
-
-=over
-
-=item C<"q">
-
-Stands for "Query access". This is really a no-op since you always have
-query access when you open a file. You can specify C<"q"> to document
-that you plan to query the file [or device, etc.]. This is especially
-helpful when you don't want read nor write access since something like
-C<"q"> or C<"q ke"> may be easier to understand than just C<""> or C<"ke">.
-
-=item C<"r">
-
-Stands for "Read access". Sets the C<GENERIC_READ> bit(s) in the
-C<$uAccess> that is passed to C<CreateFile>. This is the default
-access if the C<$svAccess> parameter is missing [or if it is C<undef>
-and C<$rvhvOptions> doesn't specify an C<"Access"> option].
-
-=item C<"w">
-
-Stands for "Write access". Sets the C<GENERIC_WRITE> bit(s) in the
-C<$uAccess> that is passed to C<CreateFile>.
-
-=item C<"k">
-
-Stands for "Keep if exists". If the requested file exists, then it is
-opened. This is the default unless C<GENERIC_WRITE> access has been
-requested but C<GENERIC_READ> access has not been requested. Contrast
-with C<"t"> and C<"n">.
-
-=item C<"t">
-
-Stands for "Truncate if exists". If the requested file exists, then
-it is truncated to zero length and then opened. This is the default if
-C<GENERIC_WRITE> access has been requested and C<GENERIC_READ> access
-has not been requested. Contrast with C<"k"> and C<"n">.
-
-=item C<"n">
-
-Stands for "New file only". If the requested file exists, then it is
-not opened and the C<createFile> call fails. Contrast with C<"k"> and
-C<"t">. Can't be used with C<"e">.
-
-=item C<"c">
-
-Stands for "Create if none". If the requested file does not
-exist, then it is created and then opened. This is the default
-if C<GENERIC_WRITE> access has been requested or if C<"t"> or
-C<"n"> was specified. Contrast with C<"e">.
-
-=item C<"e">
-
-Stands for "Existing file only". If the requested file does not
-exist, then nothing is opened and the C<createFile> call fails. This
-is the default unless C<GENERIC_WRITE> access has been requested or
-C<"t"> or C<"n"> was specified. Contrast with C<"c">. Can't be
-used with C<"n">.
-
-=back
-
-The characters from C<"ktn"> and C<"ce"> are combined to determine the
-what value for C<$uCreate> to pass to C<CreateFile> [unless overridden
-by C<$rvhvOptions>]:
-
-=over
-
-=item C<"kc">
-
-C<OPEN_ALWAYS>
-
-=item C<"ke">
-
-C<OPEN_EXISTING>
-
-=item C<"tc">
-
-C<TRUNCATE_EXISTING>
-
-=item C<"te">
-
-C<CREATE_ALWAYS>
-
-=item C<"nc">
-
-C<CREATE_NEW>
-
-=item C<"ne">
-
-Illegal.
-
-=back
-
-C<$svShare> controls how the file is shared, that is, whether other
-processes can have read, write, and/or delete access to the file while
-we have it opened. C<$svShare> will usually be a string containing zero
-or more characters from C<"rwd"> but can also be a numeric bit mask.
-
-C<"r"> sets the C<FILE_SHARE_READ> bit which allows other processes to have
-read access to the file. C<"w"> sets the C<FILE_SHARE_WRITE> bit which
-allows other processes to have write access to the file. C<"d"> sets the
-C<FILE_SHARE_DELETE> bit which allows other processes to have delete access
-to the file [ignored under Windows 95].
-
-The default for C<$svShare> is C<"rw"> which provides the same sharing as
-using regular perl C<open()>.
-
-If another process currently has read, write, and/or delete access to
-the file and you don't allow that level of sharing, then your call to
-C<createFile> will fail. If you requested read, write, and/or delete
-access and another process already has the file open but doesn't allow
-that level of sharing, then your call to C<createFile> will fail. Once
-you have the file open, if another process tries to open it with read,
-write, and/or delete access and you don't allow that level of sharing,
-then that process won't be allowed to open the file.
-
-C<$rvhvOptions> is a reference to a hash where any keys must be from
-the list C<qw( Access Create Share Attributes Flags Security Model )>.
-The meaning of the value depends on the key name, as described below.
-Any option values in C<$rvhvOptions> override the settings from
-C<$svAccess> and C<$svShare> if they conflict.
-
-=over
-
-=item Flags => $uFlags
-
-C<$uFlags> is an unsigned value having any of the C<FILE_FLAG_*> or
-C<FILE_ATTRIBUTE_*> bits set. Any C<FILE_ATTRIBUTE_*> bits set via the
-C<Attributes> option are logically C<or>ed with these bits. Defaults
-to C<0>.
-
-If opening the client side of a named pipe, then you can also specify
-C<SECURITY_SQOS_PRESENT> along with one of the other C<SECURITY_*>
-constants to specify the security quality of service to be used.
-
-=item Attributes => $sAttributes
-
-A string of zero or more characters from C<"achorst"> [see C<attrLetsToBits>
-for more information] which are converted to C<FILE_ATTRIBUTE_*> bits to
-be set in the C<$uFlags> argument passed to C<CreateFile>.
-
-=item Security => $pSecurityAttributes
-
-C<$pSecurityAttributes> should contain a C<SECURITY_ATTRIBUTES> structure
-packed into a string or C<[]> [the default].
-
-=item Model => $hModelFile
-
-C<$hModelFile> should contain a handle opened with C<GENERIC_READ>
-access to a model file from which file attributes and extended attributes
-are to be copied. Or C<$hModelFile> can be C<0> [the default].
-
-=item Access => $sAccess
-
-=item Access => $uAccess
-
-C<$sAccess> should be a string of zero or more characters from
-C<"qrw"> specifying the type of access desired: "query" or C<0>,
-"read" or C<GENERIC_READ> [the default], or "write" or
-C<GENERIC_WRITE>.
-
-C<$uAccess> should be an unsigned value containing bits set to
-indicate the type of access desired. C<GENERIC_READ> is the default.
-
-=item Create => $sCreate
-
-=item Create => $uCreate
-
-C<$sCreate> should be a string constaing zero or one character from
-C<"ktn"> and zero or one character from C<"ce">. These stand for
-"Keep if exists", "Truncate if exists", "New file only", "Create if
-none", and "Existing file only". These are translated into a
-C<$uCreate> value.
-
-C<$uCreate> should be one of C<OPEN_ALWAYS>, C<OPEN_EXISTING>,
-C<TRUNCATE_EXISTING>, C<CREATE_ALWAYS>, or C<CREATE_NEW>.
-
-=item Share => $sShare
-
-=item Share => $uShare
-
-C<$sShare> should be a string with zero or more characters from
-C<"rwd"> that is translated into a C<$uShare> value. C<"rw"> is
-the default.
-
-C<$uShare> should be an unsigned value having zero or more of the
-following bits set: C<FILE_SHARE_READ>, C<FILE_SHARE_WRITE>, and
-C<FILE_SHARE_DELETE>. C<FILE_SHARE_READ|FILE_SHARE_WRITE> is the
-default.
-
-=back
-
-Examples:
-
- $hFlop= createFile( "//./A:", "r", "r" )
- or die "Can't prevent others from writing to floppy: $^E\n";
- $hDisk= createFile( "//./C:", "rw ke", "" )
- or die "Can't get exclusive access to C: $^E\n";
- $hDisk= createFile( $sFilePath, "ke",
- { Access=>FILE_READ_ATTRIBUTES } )
- or die "Can't read attributes of $sFilePath: $^E\n";
- $hTemp= createFile( "$ENV{Temp}/temp.$$", "wn", "",
- { Attributes=>"hst", Flags=>FILE_FLAG_DELETE_ON_CLOSE() } )
- or die "Can't create temporary file, temp.$$: $^E\n";
-
-=item getLogicalDrives
-
-=item C<@roots= getLogicalDrives()>
-
-Returns the paths to the root directories of all logical drives
-currently defined. This includes all types of drive lettters, such
-as floppies, CD-ROMs, hard disks, and network shares. A typical
-return value on a poorly equipped computer would be C<("A:\\","C:\\")>.
-
-=item CloseHandle
-
-=item C<CloseHandle( $hObject )>
-
-Closes a Win32 native handle, such as one opened via C<CreateFile>.
-Like most routines, returns a true value if successful and a false
-value [and sets C<$^E> and C<regLastError()>] on failure.
-
-=item CopyFile
-
-=item C<CopyFile( $sOldFileName, $sNewFileName, $bFailIfExists )>
-
-C<$sOldFileName> is the path to the file to be copied.
-C<$sNewFileName> is the path to where the file should be copied.
-Note that you can B<NOT> just specify a path to a directory in
-C<$sNewFileName> to copy the file to that directory using the
-same file name.
-
-If C<$bFailIfExists> is true and C<$sNewFileName> is the path to
-a file that already exists, then C<CopyFile> will fail. If
-C<$bFailIfExists> is falsea, then the copy of the C<$sOldFileNmae>
-file will overwrite the C<$sNewFileName> file if it already exists.
-
-Like most routines, returns a true value if successful and a false
-value [and sets C<$^E> and C<regLastError()>] on failure.
-
-=item CreateFile
-
-=item C<$hObject= CreateFile( $sPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )>
-
-On failure, C<$hObject> gets set to a false value and C<$^E> and
-C<fileLastError()> are set to the reason for the failure. Otherwise,
-C<$hObject> gets set to a Win32 native file handle which is always a
-true value [returns C<"0 but true"> in the impossible(?) case of the
-handle having a value of C<0>].
-
-C<$sPath> is the path to the file [or device, etc.] to be opened.
-
-C<$sPath> can use C<"/"> or C<"\\"> as path delimiters and can even
-mix the two. We will usually only use C<"/"> in our examples since
-using C<"\\"> is usually harder to read.
-
-Under Windows NT, C<$sPath> can start with C<"//?/"> to allow the use
-of paths longer than C<MAX_PATH> [for UNC paths, replace the leading
-C<"//"> with C<"//?/UNC/">, as in C<"//?/UNC/Server/Share/Dir/File.Ext">].
-
-C<$sPath> can start with C<"//./"> to indicate that the rest of the
-path is the name of a "DOS device." You can use C<QueryDosDevice>
-to list all current DOS devices and can add or delete them with
-C<DefineDosDevice>. If you get the source-code distribution of this
-module from CPAN, then it includes an example script, F<ex/ListDevs.plx>
-that will list all current DOS devices and their "native" definition.
-Again, note that this doesn't work under Win95 nor Win98.
-
-The most common such DOS devices include:
-
-=over
-
-=item C<"//./PhysicalDrive0">
-
-Your entire first hard disk. Doesn't work under Windows 95. This
-allows you to read or write raw sectors of your hard disk and to use
-C<DeviceIoControl> to perform miscellaneous queries and operations
-to the hard disk. Writing raw sectors and certain other operations
-can seriously damage your files or the function of your computer.
-
-Locking this for exclusive access [by specifying C<0> for C<$uShare>]
-doesn't prevent access to the partitions on the disk nor their file
-systems. So other processes can still access any raw sectors within
-a partition and can use the file system on the disk as usual.
-
-=item C<"//./C:">
-
-Your F<C:> partition. Doesn't work under Windows 95. This allows
-you to read or write raw sectors of that partition and to use
-C<DeviceIoControl> to perform miscellaneous queries and operations
-to the partition. Writing raw sectors and certain other operations
-can seriously damage your files or the function of your computer.
-
-Locking this for exclusive access doesn't prevent access to the
-physical drive that the partition is on so other processes can
-still access the raw sectors that way. Locking this for exclusive
-access B<does> prevent other processes from opening the same raw
-partition and B<does> prevent access to the file system on it. It
-even prevents the current process from accessing the file system
-on that partition.
-
-=item C<"//./A:">
-
-The raw floppy disk. Doesn't work under Windows 95. This allows
-you to read or write raw sectors of the floppy disk and to use
-C<DeviceIoControl> to perform miscellaneous queries and operations
-to the floopy disk or drive.
-
-Locking this for exclusive access prevents all access to the floppy.
-
-=item C<"//./PIPE/PipeName">
-
-A named pipe, created via C<CreateNamedPipe>.
-
-=back
-
-C<$uAccess> is an unsigned value with bits set indicating the
-type of access desired. Usually either C<0> ["query" access],
-C<GENERIC_READ>, C<GENERIC_WRITE>, C<GENERIC_READ|GENERIC_WRITE>,
-or C<GENERIC_ALL>. More specific types of access can be specified,
-such as C<FILE_APPEND_DATA> or C<FILE_READ_EA>.
-
-C<$uShare> controls how the file is shared, that is, whether other
-processes can have read, write, and/or delete access to the file while
-we have it opened. C<$uShare> is an unsigned value with zero or more
-of these bits set: C<FILE_SHARE_READ>, C<FILE_SHARE_WRITE>, and
-C<FILE_SHARE_DELETE>.
-
-If another process currently has read, write, and/or delete access to
-the file and you don't allow that level of sharing, then your call to
-C<CreateFile> will fail. If you requested read, write, and/or delete
-access and another process already has the file open but doesn't allow
-that level of sharing, thenn your call to C<createFile> will fail. Once
-you have the file open, if another process tries to open it with read,
-write, and/or delete access and you don't allow that level of sharing,
-then that process won't be allowed to open the file.
-
-C<$pSecAttr> should either be C<[]> [for C<NULL>] or a
-C<SECURITY_ATTRIBUTES> data structure packed into a string.
-For example, if C<$pSecDesc> contains a C<SECURITY_DESCRIPTOR>
-structure packed into a string, perhaps via:
-
- RegGetKeySecurity( $key, 4, $pSecDesc, 1024 );
-
-then you can set C<$pSecAttr> via:
-
- $pSecAttr= pack( "L P i", 12, $pSecDesc, $bInheritHandle );
-
-C<$uCreate> is one of the following values: C<OPEN_ALWAYS>,
-C<OPEN_EXISTING>, C<TRUNCATE_EXISTING>, C<CREATE_ALWAYS>, and
-C<CREATE_NEW>.
-
-C<$uFlags> is an unsigned value with zero or more bits set indicating
-attributes to associate with the file [C<FILE_ATTRIBUTE_*> values] or
-special options [C<FILE_FLAG_*> values].
-
-If opening the client side of a named pipe, then you can also set
-C<$uFlags> to include C<SECURITY_SQOS_PRESENT> along with one of the
-other C<SECURITY_*> constants to specify the security quality of
-service to be used.
-
-C<$hModel> is C<0> [or C<[]>, both of which mean C<NULL>] or a Win32
-native handle opened with C<GENERIC_READ> access to a model file from
-which file attributes and extended attributes are to be copied if a
-new file gets created.
-
-Examples:
-
- $hFlop= CreateFile( "//./A:", GENERIC_READ(),
- FILE_SHARE_READ(), [], OPEN_EXISTING(), 0, [] )
- or die "Can't prevent others from writing to floppy: $^E\n";
- $hDisk= CreateFile( $sFilePath, FILE_READ_ATTRIBUTES(),
- FILE_SHARE_READ()|FILE_SHARE_WRITE(), [], OPEN_EXISTING(), 0, [] )
- or die "Can't read attributes of $sFilePath: $^E\n";
- $hTemp= CreateFile( "$ENV{Temp}/temp.$$", GENERIC_WRITE(), 0,
- CREATE_NEW(), FILE_FLAG_DELETE_ON_CLOSE()|attrLetsToBits("hst"), [] )
- or die "Can't create temporary file, temp.$$: $^E\n";
-
-=item DefineDosDevice
-
-=item C<DefineDosDevice( $uFlags, $sDosDeviceName, $sTargetPath )>
-
-Defines a new DOS device, overrides the current definition of a DOS
-device, or deletes a definition of a DOS device. Like most routines,
-returns a true value if successful and a false value [and sets C<$^E>
-and C<regLastError()>] on failure.
-
-C<$sDosDeviceName> is the name of a DOS device for which we'd like
-to add or delete a definition.
-
-C<$uFlags> is an unsigned value with zero or more of the following
-bits set:
-
-=over
-
-=item C<DDD_RAW_TARGET_PATH>
-
-Indicates that C<$sTargetPath> will be a raw Windows NT object name.
-This usually means that C<$sTargetPath> starts with C<"\\Device\\">.
-Note that you cannot use C<"/"> in place of C<"\\"> in raw target path
-names.
-
-=item C<DDD_REMOVE_DEFINITION>
-
-Requests that a definition be deleted. If C<$sTargetPath> is
-C<[]> [for C<NULL>], then the most recently added definition for
-C<$sDosDeviceName> is removed. Otherwise the most recently added
-definition matching C<$sTargetPath> is removed.
-
-If the last definition is removed, then the DOS device name is
-also deleted.
-
-=item C<DDD_EXACT_MATCH_ON_REMOVE>
-
-When deleting a definition, this bit causes each C<$sTargetPath> to
-be compared to the full-length definition when searching for the most
-recently added match. If this bit is not set, then C<$sTargetPath>
-only needs to match a prefix of the definition.
-
-=back
-
-C<$sTargetPath> is the DOS device's specific definition that you
-wish to add or delete. For C<DDD_RAW_TARGET_PATH>, these usually
-start with C<"\\Device\\">. If the C<DDD_RAW_TARGET_PATH> bit is
-not set, then C<$sTargetPath> is just an ordinary path to some file
-or directory, providing the functionality of the B<subst> command.
-
-=item DeleteFile
-
-=item C<DeleteFile( $sFileName )>
-
-Deletes the named file. Compared to Perl's C<unlink>, C<DeleteFile>
-has the advantage of not deleting read-only files. For B<some>
-versions of Perl, C<unlink> silently calls C<chmod> whether it needs
-to or not before deleting the file so that files that you have
-protected by marking them as read-only are not always protected from
-Perl's C<unlink>.
-
-Like most routines, returns a true value if successful and a false
-value [and sets C<$^E> and C<regLastError()>] on failure.
-
-=item DeviceIoControl
-
-=item C<DeviceIoControl( $hDevice, $uIoControlCode, $pInBuf, $lInBuf, $opOutBuf, $lOutBuf, $olRetBytes, $pOverlapped )>
-
-Requests a special operation on an I/O [input/output] device, such
-as ejecting a tape or formatting a disk. Like most routines, returns
-a true value if successful and a false value [and sets C<$^E> and
-C<regLastError()>] on failure.
-
-C<$hDevice> is a Win32 native file handle to a device [return value
-from C<CreateFile>].
-
-C<$uIoControlCode> is an unsigned value [a C<IOCTL_*> or C<FSCTL_*>
-constant] indicating the type query or other operation to be performed.
-
-C<$pInBuf> is C<[]> [for C<NULL>] or a data structure packed into a
-string. The type of data structure depends on the C<$uIoControlCode>
-value. C<$lInBuf> is C<0> or the length of the structure in
-C<$pInBuf>. If C<$pInBuf> is not C<[]> and C<$lInBuf> is C<0>, then
-C<$lInBuf> will automatically be set to C<length($pInBuf)> for you.
-
-C<$opOutBuf> is C<[]> [for C<NULL>] or will be set to contain a
-returned data structure packed into a string. C<$lOutBuf> indicates
-how much space to allocate in C<$opOutBuf> for C<DeviceIoControl> to
-store the data structure. If C<$lOutBuf> is a number and C<$opOutBuf>
-already has a buffer allocated for it that is larger than C<$lOutBuf>
-bytes, then this larger buffer size will be passed to C<DeviceIoControl>.
-However, you can force a specific buffer size to be passed to
-C<DeviceIoControl> by prepending a C<"="> to the front of C<$lOutBuf>.
-
-C<$olRetBytes> is C<[]> or is a scalar to receive the number of bytes
-written to C<$opOutBuf>. Even when C<$olRetBytes> is C<[]>, a valid
-pointer to a C<DWORD> [and not C<NULL>] is passed to C<DeviceIoControl>.
-In this case, C<[]> just means that you don't care about the value
-that might be written to C<$olRetBytes>, which is usually the case
-since you can usually use C<length($opOutBuf)> instead.
-
-C<$pOverlapped> is C<[]> or is a C<OVERLAPPED> structure packed into
-a string. This is only useful if C<$hDevice> was opened with the
-C<FILE_FLAG_OVERLAPPED> flag set.
-
-=item FdGetOsFHandle
-
-=item C<$hNativeHandle= FdGetOsFHandle( $ivFd )>
-
-C<FdGetOsFHandle> simply calls C<_get_osfhandle()>. It was renamed
-to better fit in with the rest the function names of this module,
-in particular to distinguish it from C<GetOsFHandle>. It takes an
-integer file descriptor [as from Perl's C<fileno>] and returns the
-Win32 native file handle associated with that file descriptor or
-C<INVALID_HANDLE_VALUE> if C<$ivFd> is not an open file descriptor.
-
-When you call Perl's C<open> to set a Perl file handle [like C<STDOUT>],
-Perl calls C's C<fopen> to set a stdio C<FILE *>. C's C<fopen> calls
-something like Unix's C<open>, that is, Win32's C<_sopen>, to get an
-integer file descriptor [where 0 is for C<STDIN>, 1 for C<STDOUT>, etc.].
-Win32's C<_sopen> calls C<CreateFile> to set a C<HANDLE>, a Win32 native
-file handle. So every Perl file handle [like C<STDOUT>] has an integer
-file descriptor associated with it that you can get via C<fileno>. And,
-under Win32, every file descriptor has a Win32 native file handle
-associated with it. C<FdGetOsFHandle> lets you get access to that.
-
-C<$hNativeHandle> is set to C<INVALID_HANDLE_VALUE> [and
-C<lastFileError()> and C<$^E> are set] if C<FdGetOsFHandle> fails.
-See also C<GetOsFHandle> which provides a friendlier interface.
-
-=item fileConstant
-
-=item C<$value= fileConstant( $sConstantName )>
-
-Fetch the value of a constant. Returns C<undef> if C<$sConstantName>
-is not the name of a constant supported by this module. Never sets
-C<$!> nor C<$^E>.
-
-This function is rarely used since you will usually get the value of a
-constant by having that constant imported into your package by listing
-the constant name in the C<use Win32API::File> statement and then
-simply using the constant name in your code [perhaps followed by
-C<()>]. This function is useful for verifying constant names not in
-Perl code, for example, after prompting a user to type in a constant
-name.
-
-=item fileLastError
-
-=item C<$svError= fileLastError();>
-
-=item C<fileLastError( $uError );>
-
-Returns the last error encountered by a routine from this module.
-It is just like C<$^E> except it isn't changed by anything except
-routines from this module. Ideally you could just use C<$^E>, but
-current versions of Perl often overwrite C<$^E> before you get a
-chance to check it and really old versions of Perl don't really
-support C<$^E> under Win32.
-
-Just like C<$^E>, in a numeric context C<fileLastError()> returns
-the numeric error value while in a string context it returns a
-text description of the error [actually it returns a Perl scalar
-that contains both values so C<$x= fileLastError()> causes C<$x>
-to give different values in string vs. numeric contexts].
-
-The last form sets the error returned by future calls to
-C<fileLastError()> and should not be used often. C<$uError> must
-be a numeric error code. Also returns the dual-valued version
-of C<$uError>.
-
-=item GetDriveType
-
-=item C<$uDriveType= GetDriveType( $sRootPath )>
-
-Takes a string giving the path to the root directory of a file system
-[called a "drive" because every file system is assigned a "drive letter"]
-and returns an unsigned value indicating the type of drive the file
-system is on. The return value should be one of:
-
-=over
-
-=item C<DRIVE_UNKNOWN>
-
-None of the following.
-
-=item C<DRIVE_NO_ROOT_DIR>
-
-A "drive" that does not have a file system. This can be a drive letter
-that hasn't been defined or a drive letter assigned to a partition
-that hasn't been formatted yet.
-
-=item C<DRIVE_REMOVABLE>
-
-A floppy diskette drive or other removable media drive, but not a CD-ROM
-drive.
-
-=item C<DRIVE_FIXED>
-
-An ordinary hard disk partition.
-
-=item C<DRIVE_REMOTE>
-
-A network share.
-
-=item C<DRIVE_CDROM>
-
-A CD-ROM drive.
-
-=item C<DRIVE_RAMDISK>
-
-A "ram disk" or memory-resident virtual file system used for high-speed
-access to small amounts of temporary file space.
-
-=back
-
-=item GetFileAttributes
-
-=item C<$uAttrs = GetFileAttributes( $sPath )>
-
-Takes a path string and returns an unsigned value with attribute flags.
-If it fails, it returns INVALID_FILE_ATTRIBUTES, otherwise it can be
-one or more of the following values:
-
-=over
-
-=item C<FILE_ATTRIBUTE_ARCHIVE>
-
-The file or directory is an archive file or directory. Applications use
-this attribute to mark files for backup or removal.
-
-=item C<FILE_ATTRIBUTE_COMPRESSED>
-
-The file or directory is compressed. For a file, this means that all of
-the data in the file is compressed. For a directory, this means that
-compression is the default for newly created files and subdirectories.
-
-=item C<FILE_ATTRIBUTE_DEVICE>
-
-Reserved; do not use.
-
-=item C<FILE_ATTRIBUTE_DIRECTORY>
-
-The handle identifies a directory.
-
-=item C<FILE_ATTRIBUTE_ENCRYPTED>
-
-The file or directory is encrypted. For a file, this means that all data
-streams in the file are encrypted. For a directory, this means that
-encryption is the default for newly created files and subdirectories.
-
-=item C<FILE_ATTRIBUTE_HIDDEN>
-
-The file or directory is hidden. It is not included in an ordinary directory
-listing.
-
-=item C<FILE_ATTRIBUTE_NORMAL>
-
-The file or directory has no other attributes set. This attribute is valid
-only if used alone.
-
-=item C<FILE_ATTRIBUTE_NOT_CONTENT_INDEXED>
-
-The file will not be indexed by the content indexing service.
-
-=item C<FILE_ATTRIBUTE_OFFLINE>
-
-The data of the file is not immediately available. This attribute indicates
-that the file data has been physically moved to offline storage. This
-attribute is used by Remote Storage, the hierarchical storage management
-software. Applications should not arbitrarily change this attribute.
-
-=item C<FILE_ATTRIBUTE_READONLY>
-
-The file or directory is read-only. Applications can read the file but cannot
-write to it or delete it. In the case of a directory, applications cannot
-delete it.
-
-=item C<FILE_ATTRIBUTE_REPARSE_POINT>
-
-The file or directory has an associated reparse point.
-
-=item C<FILE_ATTRIBUTE_SPARSE_FILE>
-
-The file is a sparse file.
-
-=item C<FILE_ATTRIBUTE_SYSTEM>
-
-The file or directory is part of, or is used exclusively by, the operating
-system.
-
-=item C<FILE_ATTRIBUTE_TEMPORARY>
-
-The file is being used for temporary storage. File systems avoid writing
-data back to mass storage if sufficient cache memory is available, because
-often the application deletes the temporary file shortly after the handle is
-closed. In that case, the system can entirely avoid writing the data.
-Otherwise, the data will be written after the handle is closed.
-
-=back
-
-=item GetFileType
-
-=item C<$uFileType= GetFileType( $hFile )>
-
-Takes a Win32 native file handle and returns a C<FILE_TYPE_*> constant
-indicating the type of the file opened on that handle:
-
-=over
-
-=item C<FILE_TYPE_UNKNOWN>
-
-None of the below. Often a special device.
-
-=item C<FILE_TYPE_DISK>
-
-An ordinary disk file.
-
-=item C<FILE_TYPE_CHAR>
-
-What Unix would call a "character special file", that is, a device that
-works on character streams such as a printer port or a console.
-
-=item C<FILE_TYPE_PIPE>
-
-Either a named or anonymous pipe.
-
-=back
-
-=item getFileSize
-
-=item C<$size= getFileSize( $hFile )>
-
-This is a Perl-friendly wrapper for the C<GetFileSize> (below) API call.
-
-It takes a Win32 native file handle and returns the size in bytes. Since the
-size can be a 64 bit value, on non 64 bit integer Perls the value returned will
-be an object of type C<Math::BigInt>.
-
-=item GetFileSize
-
-=item C<$iSizeLow= GetFileSize($win32Handle, $iSizeHigh)>
-
-Returns the size of a file pointed to by C<$win32Handle>, optionally storing
-the high order 32 bits into C<$iSizeHigh> if it is not C<[]>. If $iSizeHigh is
-C<[]>, a non-zero value indicates success. Otherwise, on failure the return
-value will be C<0xffffffff> and C<fileLastError()> will not be C<NO_ERROR>.
-
-=item GetOverlappedResult
-
-=item C<$bRetval= GetOverlappedResult( $win32Handle, $pOverlapped,
- $numBytesTransferred, $bWait )>
-
-Used for asynchronous IO in Win32 to get the result of a pending IO operation,
-such as when a file operation returns C<ERROR_IO_PENDING>. Returns a false
-value on failure. The C<$overlapped> structure and C<$numBytesTransferred>
-will be modified with the results of the operation.
-
-As far as creating the C<$pOverlapped> structure, you are currently on your own.
-
-See L<http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getoverlappedresult.asp> for more information.
-
-=item GetLogicalDrives
-
-=item C<$uDriveBits= GetLogicalDrives()>
-
-Returns an unsigned value with one bit set for each drive letter currently
-defined. If "A:" is currently a valid drive letter, then the C<1> bit
-will be set in C<$uDriveBits>. If "B:" is valid, then the C<2> bit will
-be set. If "Z:" is valid, then the C<2**26> [C<0x4000000>] bit will be
-set.
-
-=item GetLogicalDriveStrings
-
-=item C<$olOutLength= GetLogicalDriveStrings( $lBufSize, $osBuffer )>
-
-For each currently defined drive letter, a C<'\0'>-terminated string
-of the path to the root of its file system is constructed. All of
-these strings are concatenated into a single larger string and an
-extra terminating C<'\0'> is added. This larger string is returned
-in C<$osBuffer>. Note that this includes drive letters that have
-been defined but that have no file system, such as drive letters
-assigned to unformatted partitions.
-
-C<$lBufSize> is the size of the buffer to allocate to store this
-list of strings. C<26*4+1> is always sufficient and should usually
-be used.
-
-C<$osBuffer> is a scalar to be set to contain the constructed string.
-
-C<$olOutLength> is the number of bytes actually written to C<$osBuffer>
-but C<length($osBuffer)> can also be used to determine this.
-
-For example, on a poorly equipped computer,
-
- GetLogicalDriveStrings( 4*26+1, $osBuffer );
-
-might set C<$osBuffer> to the 9-character string, C<"A:\\\0C:\\\0\0">.
-
-=item GetHandleInformation
-
-=item C<GetHandleInformation( $hObject, $ouFlags )>
-
-Retrieves the flags associated with a Win32 native file handle or object
-handle.
-
-C<$hObject> is an open Win32 native file handle or an open Win32 native
-handle to some other type of object.
-
-C<$ouFlags> will be set to an unsigned value having zero or more of
-the bits C<HANDLE_FLAG_INHERIT> and C<HANDLE_FLAG_PROTECT_FROM_CLOSE>
-set. See the C<":HANDLE_FLAG_"> export class for the meanings of these
-bits.
-
-=item GetOsFHandle
-
-=item C<$hNativeHandle= GetOsFHandle( FILE )>
-
-Takes a Perl file handle [like C<STDIN>] and returns the Win32 native
-file handle associated with it. See C<FdGetOsFHandle> for more
-information about Win32 native file handles.
-
-C<$hNativeHandle> is set to a false value [and C<lastFileError()> and
-C<$^E> are set] if C<GetOsFHandle> fails. C<GetOsFHandle> returns
-C<"0 but true"> in the impossible(?) case of the handle having a value
-of C<0>.
-
-=item GetVolumeInformation
-
-=item C<GetVolumeInformation( $sRootPath, $osVolName, $lVolName, $ouSerialNum, $ouMaxNameLen, $ouFsFlags, $osFsType, $lFsType )>
-
-Gets information about a file system volume, returning a true
-value if successful. On failure, returns a false value and sets
-C<fileLastError()> and C<$^E>.
-
-C<$sRootPath> is a string specifying the path to the root of the file system,
-for example, C<"C:/">.
-
-C<$osVolName> is a scalar to be set to the string representing the
-volume name, also called the file system label. C<$lVolName> is the
-number of bytes to allocate for the C<$osVolName> buffer [see
-L<Buffer Sizes> for more information].
-
-C<$ouSerialNum> is C<[]> [for C<NULL>] or will be set to the numeric
-value of the volume's serial number.
-
-C<$ouMaxNameLen> is C<[]> [for C<NULL>] or will be set to the maximum
-length allowed for a file name or directory name within the file system.
-
-C<$osFsType> is a scalar to be set to the string representing the
-file system type, such as C<"FAT"> or C<"NTFS">. C<$lFsType> is the
-number of bytes to allocate for the C<$osFsType> buffer [see
-L<Buffer Sizes> for more information].
-
-C<$ouFsFlags> is C<[]> [for C<NULL>] or will be set to an unsigned integer
-with bits set indicating properties of the file system:
-
-=over
-
-=item C<FS_CASE_IS_PRESERVED>
-
-The file system preserves the case of file names [usually true].
-That is, it doesn't change the case of file names such as forcing
-them to upper- or lower-case.
-
-=item C<FS_CASE_SENSITIVE>
-
-The file system supports the ability to not ignore the case of file
-names [but might ignore case the way you are using it]. That is, the
-file system has the ability to force you to get the letter case of a
-file's name exactly right to be able to open it. This is true for
-"NTFS" file systems, even though case in file names is usually still
-ignored.
-
-=item C<FS_UNICODE_STORED_ON_DISK>
-
-The file system preserves Unicode in file names [true for "NTFS"].
-
-=item C<FS_PERSISTENT_ACLS>
-
-The file system supports setting Access Control Lists on files [true
-for "NTFS"].
-
-=item C<FS_FILE_COMPRESSION>
-
-The file system supports compression on a per-file basis [true for
-"NTFS"].
-
-=item C<FS_VOL_IS_COMPRESSED>
-
-The entire file system is compressed such as via "DoubleSpace".
-
-=back
-
-=item IsRecognizedPartition
-
-=item C<IsRecognizedPartition( $ivPartitionType )>
-
-Takes a partition type and returns whether that partition type is
-supported under Win32. C<$ivPartitonType> is an integer value as from
-the operating system byte of a hard disk's DOS-compatible partition
-table [that is, a partition table for x86-based Win32, not, for
-example, one used with Windows NT for Alpha processors]. For example,
-the C<PartitionType> member of the C<PARTITION_INFORMATION> structure.
-
-Common values for C<$ivPartitionType> include C<PARTITION_FAT_12==1>,
-C<PARTITION_FAT_16==4>, C<PARTITION_EXTENDED==5>, C<PARTITION_FAT32==0xB>.
-
-=item IsContainerPartition
-
-=item C<IsContainerPartition( $ivPartitionType )>
-
-Takes a partition type and returns whether that partition is a
-"container" partition that is supported under Win32, that is, whether
-it is an "extended" partition that can contain "logical" partitions.
-C<$ivPartitonType> is as for C<IsRecognizedPartition>.
-
-=item MoveFile
-
-=item C<MoveFile( $sOldName, $sNewName )>
-
-Renames a file or directory. C<$sOldName> is the name of the existing
-file or directory that is to be renamed. C<$sNewName> is the new name
-to give the file or directory. Returns a true value if the move
-succeeds. For failure, returns a false value and sets
-C<fileLastErorr()> and C<$^E> to the reason for the failure.
-
-Files can be "renamed" between file systems and the file contents and
-some attributes will be moved. Directories can only be renamed within
-one file system. If there is already a file or directory named
-C<$sNewName>, then C<MoveFile> will fail.
-
-=item MoveFileEx
-
-=item C<MoveFileEx( $sOldName, $sNewName, $uFlags )>
-
-Renames a file or directory. C<$sOldName> is the name of the existing
-file or directory that is to be renamed. C<$sNewName> is the new name
-to give the file or directory. Returns a true value if the move
-succeeds. For failure, returns a false value and sets
-C<fileLastErorr()> and C<$^E> to the reason for the failure.
-
-C<$uFlags> is an unsigned value with zero or more of the following bits set:
-
-=over
-
-=item C<MOVEFILE_REPLACE_EXISTING>
-
-If this bit is set and a file [but not a directory] named C<$sNewName>
-already exists, then it will be replaced by C<$sOldName>. If this bit
-is not set then C<MoveFileEx> will fail rather than replace an existing
-C<$sNewName>.
-
-=item C<MOVEFILE_COPY_ALLOWED>
-
-Allows files [but not directories] to be moved between file systems
-by copying the C<$sOldName> file data and some attributes to
-C<$sNewName> and then deleting C<$sOldName>. If this bit is not set
-[or if C<$sOldName> denotes a directory] and C<$sNewName> refers to a
-different file system than C<$sOldName>, then C<MoveFileEx> will fail.
-
-=item C<MOVEFILE_DELAY_UNTIL_REBOOT>
-
-Preliminary verifications are made and then an entry is added to the
-Registry to cause the rename [or delete] operation to be done the
-next time this copy of the operating system is booted [right after
-any automatic file system checks have completed]. This is not
-supported under Windows 95.
-
-When this bit is set, C<$sNewName> can be C<[]> [for C<NULL>] to
-indicate that C<$sOldName> should be deleted during the next boot
-rather than renamed.
-
-Setting both the C<MOVEFILE_COPY_ALLOWED> and
-C<MOVEFILE_DELAY_UNTIL_REBOOT> bits will cause C<MoveFileEx> to fail.
-
-=item C<MOVEFILE_WRITE_THROUGH>
-
-Ensures that C<MoveFileEx> won't return until the operation has
-finished and been flushed to disk. This is not supported under
-Windows 95. Only affects file renames to another file system,
-forcing a buffer flush at the end of the copy operation.
-
-=back
-
-=item OsFHandleOpen
-
-=item C<OsFHandleOpen( FILE, $hNativeHandle, $sMode )>
-
-Opens a Perl file handle based on an already open Win32 native
-file handle [much like C's C<fdopen()> does with a file descriptor].
-Returns a true value if the open operation succeeded. For failure,
-returns a false value and sets C<$!> [and possibly C<fileLastError()>
-and C<$^E>] to the reason for the failure.
-
-C<FILE> is a Perl file handle [in any of the supported forms, a
-bareword, a string, a typeglob, or a reference to a typeglob] that
-will be opened. If C<FILE> is already open, it will automatically
-be closed before it is reopened.
-
-C<$hNativeHandle> is an open Win32 native file handle, probably the
-return value from C<CreateFile> or C<createFile>.
-
-C<$sMode> is string of zero or more letters from C<"rwatb">. These
-are translated into a combination C<O_RDONLY> [C<"r">], C<O_WRONLY>
-[C<"w">], C<O_RDWR> [C<"rw">], C<O_APPEND> [C<"a">], C<O_TEXT>
-[C<"t">], and C<O_BINARY> [C<"b">] flags [see the L<Fcntl> module]
-that is passed to C<OsFHandleOpenFd>. Currently only C<O_APPEND>
-and C<O_TEXT> have any significance.
-
-Also, a C<"r"> and/or C<"w"> in C<$sMode> is used to decide how the
-file descriptor is converted into a Perl file handle, even though this
-doesn't appear to make a difference. One of the following is used:
-
- open( FILE, "<&=".$ivFd ) # "r" w/o "w"
- open( FILE, ">&=".$ivFd ) # "w" w/o "r"
- open( FILE, "+<&=".$ivFd ) # both "r" and "w"
-
-C<OsFHandleOpen> eventually calls the Win32-specific C routine
-C<_open_osfhandle()> or Perl's "improved" version called
-C<win32_open_osfhandle()>. Prior to Perl5.005, C's
-C<_open_osfhandle()> is called which will fail if
-C<GetFileType($hNativeHandle)> would return C<FILE_TYPE_UNKNOWN>. For
-Perl5.005 and later, C<OsFHandleOpen> calls C<win32_open_osfhandle()>
-from the Perl DLL which doesn't have this restriction.
-
-=item OsFHandleOpenFd
-
-=item C<$ivFD= OsFHandleOpenFd( $hNativeHandle, $uMode )>
-
-Opens a file descriptor [C<$ivFD>] based on an already open Win32
-native file handle, C<$hNativeHandle>. This just calls the
-Win32-specific C routine C<_open_osfhandle()> or Perl's "improved"
-version called C<win32_open_osfhandle()>. Prior to Perl5.005 and in Cygwin
-Perl, C's C<_open_osfhandle()> is called which will fail if
-C<GetFileType($hNativeHandle)> would return C<FILE_TYPE_UNKNOWN>. For
-Perl5.005 and later, C<OsFHandleOpenFd> calls C<win32_open_osfhandle()> from
-the Perl DLL which doesn't have this restriction.
-
-C<$uMode> the logical combination of zero or more C<O_*> constants
-exported by the C<Fcntl> module. Currently only C<O_APPEND> and
-C<O_TEXT> have any significance.
-
-C<$ivFD> will be non-negative if the open operation was successful.
-For failure, C<-1> is returned and C<$!> [and possibly
-C<fileLastError()> and C<$^E>] is set to the reason for the failure.
-
-=item QueryDosDevice
-
-=item C<$olTargetLen= QueryDosDevice( $sDosDeviceName, $osTargetPath, $lTargetBuf )>
-
-Looks up the definition of a given "DOS" device name, yielding the
-active Windows NT native device name along with any currently dormant
-definitions.
-
-C<$sDosDeviceName> is the name of the "DOS" device whose definitions
-we want. For example, C<"C:">, C<"COM1">, or C<"PhysicalDrive0">.
-If C<$sDosDeviceName> is C<[]> [for C<NULL>], the list of all DOS
-device names is returned instead.
-
-C<$osTargetPath> will be assigned a string containing the list of
-definitions. The definitions are each C<'\0'>-terminate and are
-concatenated into the string, most recent first, with an extra C<'\0'>
-at the end of the whole string [see C<GetLogicalDriveStrings> for
-a sample of this format].
-
-C<$lTargetBuf> is the size [in bytes] of the buffer to allocate for
-C<$osTargetPath>. See L<Buffer Sizes> for more information.
-
-C<$olTargetLen> is set to the number of bytes written to
-C<$osTargetPath> but you can also use C<length($osTargetPath)>
-to determine this.
-
-For failure, C<0> is returned and C<fileLastError()> and C<$^E> are
-set to the reason for the failure.
-
-=item ReadFile
-
-=item C<ReadFile( $hFile, $opBuffer, $lBytes, $olBytesRead, $pOverlapped )>
-
-Reads bytes from a file or file-like device. Returns a true value if
-the read operation was successful. For failure, returns a false value
-and sets C<fileLastError()> and C<$^E> for the reason for the failure.
-
-C<$hFile> is a Win32 native file handle that is already open to the
-file or device to read from.
-
-C<$opBuffer> will be set to a string containing the bytes read.
-
-C<$lBytes> is the number of bytes you would like to read.
-C<$opBuffer> is automatically initialized to have a buffer large
-enough to hold that many bytes. Unlike other buffer sizes, C<$lBytes>
-does not need to have a C<"="> prepended to it to prevent a larger
-value to be passed to the underlying Win32 C<ReadFile> API. However,
-a leading C<"="> will be silently ignored, even if Perl warnings are
-enabled.
-
-If C<$olBytesRead> is not C<[]>, it will be set to the actual number
-of bytes read, though C<length($opBuffer)> can also be used to
-determine this.
-
-C<$pOverlapped> is C<[]> or is a C<OVERLAPPED> structure packed
-into a string. This is only useful if C<$hFile> was opened with
-the C<FILE_FLAG_OVERLAPPED> flag set.
-
-=item SetErrorMode
-
-=item C<$uOldMode= SetErrorMode( $uNewMode )>
-
-Sets the mode controlling system error handling B<and> returns the
-previous mode value. Both C<$uOldMode> and C<$uNewMode> will have
-zero or more of the following bits set:
-
-=over
-
-=item C<SEM_FAILCRITICALERRORS>
-
-If set, indicates that when a critical error is encountered, the call
-that triggered the error fails immediately. Normally this bit is not
-set, which means that a critical error causes a dialogue box to appear
-notifying the desktop user that some application has triggered a
-critical error. The dialogue box allows the desktop user to decide
-whether the critical error is returned to the process, is ignored, or
-the offending operation is retried.
-
-This affects the C<CreateFile> and C<GetVolumeInformation> calls.
-
-Setting this bit is useful for allowing you to check whether a floppy
-diskette is in the floppy drive.
-
-=item C<SEM_NOALIGNMENTFAULTEXCEPT>
-
-If set, this causes memory access misalignment faults to be
-automatically fixed in a manner invisible to the process. This flag
-is ignored on x86-based versions of Windows NT. This flag is not
-supported on Windows 95.
-
-=item C<SEM_NOGPFAULTERRORBOX>
-
-If set, general protection faults do not generate a dialogue box but
-can instead be handled by the process via an exception handler. This
-bit should not be set by programs that don't know how to handle such
-faults.
-
-=item C<SEM_NOOPENFILEERRORBOX>
-
-If set, then when an attempt to continue reading from or writing to
-an already open file [usually on a removable medium like a floppy
-diskette] finds the file no longer available, the call will
-immediately fail. Normally this bit is not set, which means that
-instead a dialogue box will appear notifying the desktop user that
-some application has run into this problem. The dialogue box allows
-the desktop user to decide whether the failure is returned to the
-process, is ignored, or the offending operation is retried.
-
-This affects the C<ReadFile> and C<WriteFile> calls.
-
-=back
-
-=item setFilePointer
-
-=item C<$uNewPos = setFilePointer( $hFile, $ivOffset, $uFromWhere )>
-
-This is a perl-friendly wrapper for the SetFilePointer API (below).
-C<$ivOffset> can be a 64 bit integer or C<Math::BigInt> object if your Perl
-doesn't have 64 bit integers. The return value is the new offset and will
-likewise be a 64 bit integer or a C<Math::BigInt> object.
-
-=item SetFilePointer
-
-=item C<$uNewPos = SetFilePointer( $hFile, $ivOffset, $ioivOffsetHigh, $uFromWhere )>
-
-The native Win32 version of C<seek()>. C<SetFilePointer> sets the
-position within a file where the next read or write operation will
-start from.
-
-C<$hFile> is a Win32 native file handle.
-
-C<$uFromWhere> is either C<FILE_BEGIN>, C<FILE_CURRENT>, or
-C<FILE_END>, indicating that the new file position is being specified
-relative to the beginning of the file, the current file pointer, or
-the end of the file, respectively.
-
-C<$ivOffset> is [if C<$ioivOffsetHigh> is C<[]>] the offset [in bytes]
-to the new file position from the position specified via
-C<$uFromWhere>. If C<$ioivOffsetHigh> is not C<[]>, then C<$ivOffset>
-is converted to an unsigned value to be used as the low-order 4 bytes
-of the offset.
-
-C<$ioivOffsetHigh> can be C<[]> [for C<NULL>] to indicate that you are
-only specifying a 4-byte offset and the resulting file position will
-be 0xFFFFFFFE or less [just under 4GB]. Otherwise C<$ioivOfffsetHigh>
-starts out with the high-order 4 bytes [signed] of the offset and gets
-set to the [unsigned] high-order 4 bytes of the resulting file position.
-
-The underlying C<SetFilePointer> returns C<0xFFFFFFFF> to indicate
-failure, but if C<$ioivOffsetHigh> is not C<[]>, you would also have
-to check C<$^E> to determine whether C<0xFFFFFFFF> indicates an error
-or not. C<Win32API::File::SetFilePointer> does this checking for you
-and returns a false value if and only if the underlying
-C<SetFilePointer> failed. For this reason, C<$uNewPos> is set to
-C<"0 but true"> if you set the file pointer to the beginning of the
-file [or any position with 0 for the low-order 4 bytes].
-
-So the return value will be true if the seek operation was successful.
-For failure, a false value is returned and C<fileLastError()> and
-C<$^E> are set to the reason for the failure.
-
-=item SetHandleInformation
-
-=item C<SetHandleInformation( $hObject, $uMask, $uFlags )>
-
-Sets the flags associated with a Win32 native file handle or object
-handle. Returns a true value if the operation was successful. For
-failure, returns a false value and sets C<fileLastError()> and C<$^E>
-for the reason for the failure.
-
-C<$hObject> is an open Win32 native file handle or an open Win32 native
-handle to some other type of object.
-
-C<$uMask> is an unsigned value having one or more of the bits
-C<HANDLE_FLAG_INHERIT> and C<HANDLE_FLAG_PROTECT_FROM_CLOSE> set.
-Only bits set in C<$uMask> will be modified by C<SetHandleInformation>.
-
-C<$uFlags> is an unsigned value having zero or more of the bits
-C<HANDLE_FLAG_INHERIT> and C<HANDLE_FLAG_PROTECT_FROM_CLOSE> set.
-For each bit set in C<$uMask>, the cooresponding bit in the handle's
-flags is set to the value of the cooresponding bit in C<$uFlags>.
-
-If C<$uOldFlags> were the value of the handle's flags before the
-call to C<SetHandleInformation>, then the value of the handle's
-flags afterward would be:
-
- ( $uOldFlags & ~$uMask ) | ( $uFlags & $uMask )
-
-[at least as far as the C<HANDLE_FLAG_INHERIT> and
-C<HANDLE_FLAG_PROTECT_FROM_CLOSE> bits are concerned.]
-
-See the C<":HANDLE_FLAG_"> export class for the meanings of these bits.
-
-=item WriteFile
-
-=item C<WriteFile( $hFile, $pBuffer, $lBytes, $ouBytesWritten, $pOverlapped )>
-
-Write bytes to a file or file-like device. Returns a true value if
-the operation was successful. For failure, returns a false value and
-sets C<fileLastError()> and C<$^E> for the reason for the failure.
-
-C<$hFile> is a Win32 native file handle that is already open to the
-file or device to be written to.
-
-C<$pBuffer> is a string containing the bytes to be written.
-
-C<$lBytes> is the number of bytes you would like to write. If
-C<$pBuffer> is not at least C<$lBytes> long, C<WriteFile> croaks. You
-can specify C<0> for C<$lBytes> to write C<length($pBuffer)> bytes.
-A leading C<"="> on C<$lBytes> will be silently ignored, even if Perl
-warnings are enabled.
-
-C<$ouBytesWritten> will be set to the actual number of bytes written
-unless you specify it as C<[]>.
-
-C<$pOverlapped> is C<[]> or is an C<OVERLAPPED> structure packed
-into a string. This is only useful if C<$hFile> was opened with
-the C<FILE_FLAG_OVERLAPPED> flag set.
-
-=back
-
-=item C<":FuncA">
-
-The ASCII-specific functions. Each of these is just the same as the
-version without the trailing "A".
-
- CopyFileA
- CreateFileA
- DefineDosDeviceA
- DeleteFileA
- GetDriveTypeA
- GetFileAttributesA
- GetLogicalDriveStringsA
- GetVolumeInformationA
- MoveFileA
- MoveFileExA
- QueryDosDeviceA
-
-=item C<":FuncW">
-
-The wide-character-specific (Unicode) functions. Each of these is
-just the same as the version without the trailing "W" except that
-strings are expected in Unicode and some lengths are measured as
-number of C<WCHAR>s instead of number of bytes, as indicated below.
-
-=over
-
-=item CopyFileW
-
-=item C<CopyFileW( $swOldFileName, $swNewFileName, $bFailIfExists )>
-
-C<$swOldFileName> and C<$swNewFileName> are Unicode strings.
-
-=item CreateFileW
-
-=item C<$hObject= CreateFileW( $swPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )>
-
-C<$swPath> is Unicode.
-
-=item DefineDosDeviceW
-
-=item C<DefineDosDeviceW( $uFlags, $swDosDeviceName, $swTargetPath )>
-
-C<$swDosDeviceName> and C<$swTargetPath> are Unicode.
-
-=item DeleteFileW
-
-=item C<DeleteFileW( $swFileName )>
-
-C<$swFileName> is Unicode.
-
-=item GetDriveTypeW
-
-=item C<$uDriveType= GetDriveTypeW( $swRootPath )>
-
-C<$swRootPath> is Unicode.
-
-=item GetFileAttributesW
-
-=item C<$uAttrs= GetFileAttributesW( $swPath )>
-
-C<$swPath> is Unicode.
-
-=item GetLogicalDriveStringsW
-
-=item C<$olwOutLength= GetLogicalDriveStringsW( $lwBufSize, $oswBuffer )>
-
-Unicode is stored in C<$oswBuffer>. C<$lwBufSize> and C<$olwOutLength>
-are measured as number of C<WCHAR>s.
-
-=item GetVolumeInformationW
-
-=item C<GetVolumeInformationW( $swRootPath, $oswVolName, $lwVolName, $ouSerialNum, $ouMaxNameLen, $ouFsFlags, $oswFsType, $lwFsType )>
-
-C<$swRootPath> is Unicode and Unicode is written to C<$oswVolName> and
-C<$oswFsType>. C<$lwVolName> and C<$lwFsType> are measures as number
-of C<WCHAR>s.
-
-=item MoveFileW
-
-=item C<MoveFileW( $swOldName, $swNewName )>
-
-C<$swOldName> and C<$swNewName> are Unicode.
-
-=item MoveFileExW
-
-=item C<MoveFileExW( $swOldName, $swNewName, $uFlags )>
-
-C<$swOldName> and C<$swNewName> are Unicode.
-
-=item QueryDosDeviceW
-
-=item C<$olwTargetLen= QueryDosDeviceW( $swDeviceName, $oswTargetPath, $lwTargetBuf )>
-
-C<$swDeviceName> is Unicode and Unicode is written to
-C<$oswTargetPath>. C<$lwTargetBuf> and C<$olwTargetLen> are measured
-as number of C<WCHAR>s.
-
-=back
-
-=item C<":Misc">
-
-Miscellaneous constants. Used for the C<$uCreate> argument of
-C<CreateFile> or the C<$uFromWhere> argument of C<SetFilePointer>.
-Plus C<INVALID_HANDLE_VALUE>, which you usually won't need to check
-for since most routines translate it into a false value.
-
- CREATE_ALWAYS CREATE_NEW OPEN_ALWAYS
- OPEN_EXISTING TRUNCATE_EXISTING INVALID_HANDLE_VALUE
- FILE_BEGIN FILE_CURRENT FILE_END
-
-=item C<":DDD_">
-
-Constants for the C<$uFlags> argument of C<DefineDosDevice>.
-
- DDD_EXACT_MATCH_ON_REMOVE
- DDD_RAW_TARGET_PATH
- DDD_REMOVE_DEFINITION
-
-=item C<":DRIVE_">
-
-Constants returned by C<GetDriveType>.
-
- DRIVE_UNKNOWN DRIVE_NO_ROOT_DIR DRIVE_REMOVABLE
- DRIVE_FIXED DRIVE_REMOTE DRIVE_CDROM
- DRIVE_RAMDISK
-
-=item C<":FILE_">
-
-Specific types of access to files that can be requested via the
-C<$uAccess> argument to C<CreateFile>.
-
- FILE_READ_DATA FILE_LIST_DIRECTORY
- FILE_WRITE_DATA FILE_ADD_FILE
- FILE_APPEND_DATA FILE_ADD_SUBDIRECTORY
- FILE_CREATE_PIPE_INSTANCE FILE_READ_EA
- FILE_WRITE_EA FILE_EXECUTE
- FILE_TRAVERSE FILE_DELETE_CHILD
- FILE_READ_ATTRIBUTES FILE_WRITE_ATTRIBUTES
- FILE_ALL_ACCESS FILE_GENERIC_READ
- FILE_GENERIC_WRITE FILE_GENERIC_EXECUTE )],
-
-=item C<":FILE_ATTRIBUTE_">
-
-File attribute constants. Returned by C<attrLetsToBits> and used in
-the C<$uFlags> argument to C<CreateFile>.
-
- FILE_ATTRIBUTE_ARCHIVE FILE_ATTRIBUTE_COMPRESSED
- FILE_ATTRIBUTE_HIDDEN FILE_ATTRIBUTE_NORMAL
- FILE_ATTRIBUTE_OFFLINE FILE_ATTRIBUTE_READONLY
- FILE_ATTRIBUTE_SYSTEM FILE_ATTRIBUTE_TEMPORARY
-
-In addition, C<GetFileAttributes> can return these constants (or
-INVALID_FILE_ATTRIBUTES in case of an error).
-
- FILE_ATTRIBUTE_DEVICE FILE_ATTRIBUTE_DIRECTORY
- FILE_ATTRIBUTE_ENCRYPTED FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
- FILE_ATTRIBUTE_REPARSE_POINT FILE_ATTRIBUTE_SPARSE_FILE
-
-=item C<":FILE_FLAG_">
-
-File option flag constants. Used in the C<$uFlags> argument to
-C<CreateFile>.
-
- FILE_FLAG_BACKUP_SEMANTICS FILE_FLAG_DELETE_ON_CLOSE
- FILE_FLAG_NO_BUFFERING FILE_FLAG_OVERLAPPED
- FILE_FLAG_POSIX_SEMANTICS FILE_FLAG_RANDOM_ACCESS
- FILE_FLAG_SEQUENTIAL_SCAN FILE_FLAG_WRITE_THROUGH
- FILE_FLAG_OPEN_REPARSE_POINT
-
-=item C<":FILE_SHARE_">
-
-File sharing constants. Used in the C<$uShare> argument to
-C<CreateFile>.
-
- FILE_SHARE_DELETE FILE_SHARE_READ FILE_SHARE_WRITE
-
-=item C<":FILE_TYPE_">
-
-File type constants. Returned by C<GetFileType>.
-
- FILE_TYPE_CHAR FILE_TYPE_DISK
- FILE_TYPE_PIPE FILE_TYPE_UNKNOWN
-
-=item C<":FS_">
-
-File system characteristics constants. Placed in the C<$ouFsFlags>
-argument to C<GetVolumeInformation>.
-
- FS_CASE_IS_PRESERVED FS_CASE_SENSITIVE
- FS_UNICODE_STORED_ON_DISK FS_PERSISTENT_ACLS
- FS_FILE_COMPRESSION FS_VOL_IS_COMPRESSED
-
-=item C<":HANDLE_FLAG_">
-
-Flag bits modifying the behavior of an object handle and accessed via
-C<GetHandleInformation> and C<SetHandleInformation>.
-
-=over
-
-=item HANDLE_FLAG_INHERIT
-
-If this bit is set, then children of this process who inherit handles
-[that is, processes created by calls to the Win32 C<CreateProcess> API
-with the C<bInheritHandles> parameter specified as C<TRUE>], will inherit
-this particular object handle.
-
-=item HANDLE_FLAG_PROTECT_FROM_CLOSE
-
-If this bit is set, then calls to C<CloseHandle> against this handle
-will be ignored, leaving the handle open and usable.
-
-=back
-
-=item C<":IOCTL_STORAGE_">
-
-I/O control operations for generic storage devices. Used in the
-C<$uIoControlCode> argument to C<DeviceIoControl>. Includes
-C<IOCTL_STORAGE_CHECK_VERIFY>, C<IOCTL_STORAGE_MEDIA_REMOVAL>,
-C<IOCTL_STORAGE_EJECT_MEDIA>, C<IOCTL_STORAGE_LOAD_MEDIA>,
-C<IOCTL_STORAGE_RESERVE>, C<IOCTL_STORAGE_RELEASE>,
-C<IOCTL_STORAGE_FIND_NEW_DEVICES>, and
-C<IOCTL_STORAGE_GET_MEDIA_TYPES>.
-
-=over
-
-=item C<IOCTL_STORAGE_CHECK_VERIFY>
-
-Verify that a device's media is accessible. C<$pInBuf> and C<$opOutBuf>
-should both be C<[]>. If C<DeviceIoControl> returns a true value, then
-the media is currently accessible.
-
-=item C<IOCTL_STORAGE_MEDIA_REMOVAL>
-
-Allows the device's media to be locked or unlocked. C<$opOutBuf> should
-be C<[]>. C<$pInBuf> should be a C<PREVENT_MEDIA_REMOVAL> data structure,
-which is simply an interger containing a boolean value:
-
- $pInBuf= pack( "i", $bPreventMediaRemoval );
-
-=item C<IOCTL_STORAGE_EJECT_MEDIA>
-
-Requests that the device eject the media. C<$pInBuf> and C<$opOutBuf>
-should both be C<[]>.
-
-=item C<IOCTL_STORAGE_LOAD_MEDIA>
-
-Requests that the device load the media. C<$pInBuf> and C<$opOutBuf>
-should both be C<[]>.
-
-=item C<IOCTL_STORAGE_RESERVE>
-
-Requests that the device be reserved. C<$pInBuf> and C<$opOutBuf>
-should both be C<[]>.
-
-=item C<IOCTL_STORAGE_RELEASE>
-
-Releases a previous device reservation. C<$pInBuf> and C<$opOutBuf>
-should both be C<[]>.
-
-=item C<IOCTL_STORAGE_FIND_NEW_DEVICES>
-
-No documentation on this IOCTL operation was found.
-
-=item C<IOCTL_STORAGE_GET_MEDIA_TYPES>
-
-Requests information about the type of media supported by the device.
-C<$pInBuf> should be C<[]>. C<$opOutBuf> will be set to contain a
-vector of C<DISK_GEOMETRY> data structures, which can be decoded via:
-
- # Calculate the number of DISK_GEOMETRY structures returned:
- my $cStructs= length($opOutBuf)/(4+4+4+4+4+4);
- my @fields= unpack( "L l I L L L" x $cStructs, $opOutBuf )
- my( @ucCylsLow, @ivcCylsHigh, @uMediaType, @uTracksPerCyl,
- @uSectsPerTrack, @uBytesPerSect )= ();
- while( @fields ) {
- push( @ucCylsLow, unshift @fields );
- push( @ivcCylsHigh, unshift @fields );
- push( @uMediaType, unshift @fields );
- push( @uTracksPerCyl, unshift @fields );
- push( @uSectsPerTrack, unshift @fields );
- push( @uBytesPerSect, unshift @fields );
- }
-
-For the C<$i>th type of supported media, the following variables will
-contain the following data.
-
-=over
-
-=item C<$ucCylsLow[$i]>
-
-The low-order 4 bytes of the total number of cylinders.
-
-=item C<$ivcCylsHigh[$i]>
-
-The high-order 4 bytes of the total number of cylinders.
-
-=item C<$uMediaType[$i]>
-
-A code for the type of media. See the C<":MEDIA_TYPE"> export class.
-
-=item C<$uTracksPerCyl[$i]>
-
-The number of tracks in each cylinder.
-
-=item C<$uSectsPerTrack[$i]>
-
-The number of sectors in each track.
-
-=item C<$uBytesPerSect[$i]>
-
-The number of bytes in each sector.
-
-=back
-
-=back
-
-=item C<":IOCTL_DISK_">
-
-I/O control operations for disk devices. Used in the C<$uIoControlCode>
-argument to C<DeviceIoControl>. Most of these are to be used on
-physical drive devices like C<"//./PhysicalDrive0">. However,
-C<IOCTL_DISK_GET_PARTITION_INFO> and C<IOCTL_DISK_SET_PARTITION_INFO>
-should only be used on a single-partition device like C<"//./C:">. Also,
-C<IOCTL_DISK_GET_MEDIA_TYPES> is documented as having been superceded but
-is still useful when used on a floppy device like C<"//./A:">.
-
-Includes C<IOCTL_DISK_FORMAT_TRACKS>, C<IOCTL_DISK_FORMAT_TRACKS_EX>,
-C<IOCTL_DISK_GET_DRIVE_GEOMETRY>, C<IOCTL_DISK_GET_DRIVE_LAYOUT>,
-C<IOCTL_DISK_GET_MEDIA_TYPES>, C<IOCTL_DISK_GET_PARTITION_INFO>,
-C<IOCTL_DISK_HISTOGRAM_DATA>, C<IOCTL_DISK_HISTOGRAM_RESET>,
-C<IOCTL_DISK_HISTOGRAM_STRUCTURE>, C<IOCTL_DISK_IS_WRITABLE>,
-C<IOCTL_DISK_LOGGING>, C<IOCTL_DISK_PERFORMANCE>,
-C<IOCTL_DISK_REASSIGN_BLOCKS>, C<IOCTL_DISK_REQUEST_DATA>,
-C<IOCTL_DISK_REQUEST_STRUCTURE>, C<IOCTL_DISK_SET_DRIVE_LAYOUT>,
-C<IOCTL_DISK_SET_PARTITION_INFO>, and C<IOCTL_DISK_VERIFY>.
-
-=over
-
-=item C<IOCTL_DISK_GET_DRIVE_GEOMETRY>
-
-Request information about the size and geometry of the disk. C<$pInBuf>
-should be C<[]>. C<$opOutBuf> will be set to a C<DISK_GEOMETRY> data
-structure which can be decode via:
-
- ( $ucCylsLow, $ivcCylsHigh, $uMediaType, $uTracksPerCyl,
- $uSectsPerTrack, $uBytesPerSect )= unpack( "L l I L L L", $opOutBuf );
-
-=over
-
-=item C<$ucCylsLow>
-
-The low-order 4 bytes of the total number of cylinders.
-
-=item C<$ivcCylsHigh>
-
-The high-order 4 bytes of the total number of cylinders.
-
-=item C<$uMediaType>
-
-A code for the type of media. See the C<":MEDIA_TYPE"> export class.
-
-=item C<$uTracksPerCyl>
-
-The number of tracks in each cylinder.
-
-=item C<$uSectsPerTrack>
-
-The number of sectors in each track.
-
-=item C<$uBytesPerSect>
-
-The number of bytes in each sector.
-
-=back
-
-=item C<IOCTL_DISK_GET_PARTITION_INFO>
-
-Request information about the size and geometry of the partition.
-C<$pInBuf> should be C<[]>. C<$opOutBuf> will be set to a
-C<PARTITION_INFORMATION> data structure which can be decode via:
-
- ( $uStartLow, $ivStartHigh, $ucHiddenSects, $uPartitionSeqNumber,
- $uPartitionType, $bActive, $bRecognized, $bToRewrite )=
- unpack( "L l L L C c c c", $opOutBuf );
-
-=over
-
-=item C<$uStartLow> and C<$ivStartHigh>
-
-The low-order and high-order [respectively] 4 bytes of the starting
-offset of the partition, measured in bytes.
-
-=item C<$ucHiddenSects>
-
-The number of "hidden" sectors for this partition. Actually this is
-the number of sectors found prior to this partiton, that is, the
-starting offset [as found in C<$uStartLow> and C<$ivStartHigh>]
-divided by the number of bytes per sector.
-
-=item C<$uPartitionSeqNumber>
-
-The sequence number of this partition. Partitions are numbered
-starting as C<1> [with "partition 0" meaning the entire disk].
-Sometimes this field may be C<0> and you'll have to infer the
-partition sequence number from how many partitions preceed it on
-the disk.
-
-=item C<$uPartitionType>
-
-The type of partition. See the C<":PARTITION_"> export class for a
-list of known types. See also C<IsRecognizedPartition> and
-C<IsContainerPartition>.
-
-=item C<$bActive>
-
-C<1> for the active [boot] partition, C<0> otherwise.
-
-=item C<$bRecognized>
-
-Whether this type of partition is support under Win32.
-
-=item C<$bToRewrite>
-
-Whether to update this partition information. This field is not used
-by C<IOCTL_DISK_GET_PARTITION_INFO>. For
-C<IOCTL_DISK_SET_DRIVE_LAYOUT>, you must set this field to a true
-value for any partitions you wish to have changed, added, or deleted.
-
-=back
-
-=item C<IOCTL_DISK_SET_PARTITION_INFO>
-
-Change the type of the partition. C<$opOutBuf> should be C<[]>.
-C<$pInBuf> should be a C<SET_PARTITION_INFORMATION> data structure
-which is just a single byte containing the new parition type [see
-the C<":PARTITION_"> export class for a list of known types]:
-
- $pInBuf= pack( "C", $uPartitionType );
-
-=item C<IOCTL_DISK_GET_DRIVE_LAYOUT>
-
-Request information about the disk layout. C<$pInBuf> should be C<[]>.
-C<$opOutBuf> will be set to contain C<DRIVE_LAYOUT_INFORMATION>
-structure including several C<PARTITION_INFORMATION> structures:
-
- my( $cPartitions, $uDiskSignature )= unpack( "L L", $opOutBuf );
- my @fields= unpack( "x8" . ( "L l L L C c c c" x $cPartitions ),
- $opOutBuf );
- my( @uStartLow, @ivStartHigh, @ucHiddenSects,
- @uPartitionSeqNumber, @uPartitionType, @bActive,
- @bRecognized, @bToRewrite )= ();
- for( 1..$cPartition ) {
- push( @uStartLow, unshift @fields );
- push( @ivStartHigh, unshift @fields );
- push( @ucHiddenSects, unshift @fields );
- push( @uPartitionSeqNumber, unshift @fields );
- push( @uPartitionType, unshift @fields );
- push( @bActive, unshift @fields );
- push( @bRecognized, unshift @fields );
- push( @bToRewrite, unshift @fields );
- }
-
-=over
-
-=item C<$cPartitions>
-
-If the number of partitions on the disk.
-
-=item C<$uDiskSignature>
-
-Is the disk signature, a unique number assigned by Disk Administrator
-[F<WinDisk.exe>] and used to identify the disk. This allows drive
-letters for partitions on that disk to remain constant even if the
-SCSI Target ID of the disk gets changed.
-
-=back
-
-See C<IOCTL_DISK_GET_PARTITION_INFORMATION> for information on the
-remaining these fields.
-
-=item C<IOCTL_DISK_GET_MEDIA_TYPES>
-
-Is supposed to be superseded by C<IOCTL_STORAGE_GET_MEDIA_TYPES> but
-is still useful for determining the types of floppy diskette formats
-that can be produced by a given floppy drive. See
-F<ex/FormatFloppy.plx> for an example.
-
-=item C<IOCTL_DISK_SET_DRIVE_LAYOUT>
-
-Change the partition layout of the disk. C<$pOutBuf> should be C<[]>.
-C<$pInBuf> should be a C<DISK_LAYOUT_INFORMATION> data structure
-including several C<PARTITION_INFORMATION> data structures.
-
- # Already set: $cPartitions, $uDiskSignature, @uStartLow, @ivStartHigh,
- # @ucHiddenSects, @uPartitionSeqNumber, @uPartitionType, @bActive,
- # @bRecognized, and @bToRewrite.
- my( @fields, $prtn )= ();
- for $prtn ( 1..$cPartition ) {
- push( @fields, $uStartLow[$prtn-1], $ivStartHigh[$prtn-1],
- $ucHiddenSects[$prtn-1], $uPartitionSeqNumber[$prtn-1],
- $uPartitionType[$prtn-1], $bActive[$prtn-1],
- $bRecognized[$prtn-1], $bToRewrite[$prtn-1] );
- }
- $pInBuf= pack( "L L" . ( "L l L L C c c c" x $cPartitions ),
- $cPartitions, $uDiskSignature, @fields );
-
-To delete a partition, zero out all fields except for C<$bToRewrite>
-which should be set to C<1>. To add a partition, increment
-C<$cPartitions> and add the information for the new partition
-into the arrays, making sure that you insert C<1> into @bToRewrite.
-
-See C<IOCTL_DISK_GET_DRIVE_LAYOUT> and
-C<IOCTL_DISK_GET_PARITITON_INFORMATION> for descriptions of the
-fields.
-
-=item C<IOCTL_DISK_VERIFY>
-
-Performs a logical format of [part of] the disk. C<$opOutBuf> should
-be C<[]>. C<$pInBuf> should contain a C<VERIFY_INFORMATION> data
-structure:
-
- $pInBuf= pack( "L l L",
- $uStartOffsetLow, $ivStartOffsetHigh, $uLength );
-
-=over
-
-=item C<$uStartOffsetLow> and C<$ivStartOffsetHigh>
-
-The low-order and high-order [respectively] 4 bytes of the offset [in
-bytes] where the formatting should begin.
-
-=item C<$uLength>
-
-The length [in bytes] of the section to be formatted.
-
-=back
-
-=item C<IOCTL_DISK_FORMAT_TRACKS>
-
-Format a range of tracks on the disk. C<$opOutBuf> should be C<[]>.
-C<$pInBuf> should contain a C<FORMAT_PARAMETERS> data structure:
-
- $pInBuf= pack( "L L L L L", $uMediaType,
- $uStartCyl, $uEndCyl, $uStartHead, $uEndHead );
-
-C<$uMediaType> if the type of media to be formatted. Mostly used to
-specify the density to use when formatting a floppy diskette. See the
-C<":MEDIA_TYPE"> export class for more information.
-
-The remaining fields specify the starting and ending cylinder and
-head of the range of tracks to be formatted.
-
-=item C<IOCTL_DISK_REASSIGN_BLOCKS>
-
-Reassign a list of disk blocks to the disk's spare-block pool.
-C<$opOutBuf> should be C<[]>. C<$pInBuf> should be a
-C<REASSIGN_BLOCKS> data structure:
-
- $pInBuf= pack( "S S L*", 0, $cBlocks, @uBlockNumbers );
-
-=item C<IOCTL_DISK_PERFORMANCE>
-
-Request information about disk performance. C<$pInBuf> should be C<[]>.
-C<$opOutBuf> will be set to contain a C<DISK_PERFORMANCE> data structure:
-
- my( $ucBytesReadLow, $ivcBytesReadHigh,
- $ucBytesWrittenLow, $ivcBytesWrittenHigh,
- $uReadTimeLow, $ivReadTimeHigh,
- $uWriteTimeLow, $ivWriteTimeHigh,
- $ucReads, $ucWrites, $uQueueDepth )=
- unpack( "L l L l L l L l L L L", $opOutBuf );
-
-=item C<IOCTL_DISK_IS_WRITABLE>
-
-No documentation on this IOCTL operation was found.
-
-=item C<IOCTL_DISK_LOGGING>
-
-Control disk logging. Little documentation for this IOCTL operation
-was found. It makes use of a C<DISK_LOGGING> data structure:
-
-=over
-
-=item DISK_LOGGING_START
-
-Start logging each disk request in a buffer internal to the disk device
-driver of size C<$uLogBufferSize>:
-
- $pInBuf= pack( "C L L", 0, 0, $uLogBufferSize );
-
-=item DISK_LOGGING_STOP
-
-Stop loggin each disk request:
-
- $pInBuf= pack( "C L L", 1, 0, 0 );
-
-=item DISK_LOGGING_DUMP
-
-Copy the interal log into the supplied buffer:
-
- $pLogBuffer= ' ' x $uLogBufferSize
- $pInBuf= pack( "C P L", 2, $pLogBuffer, $uLogBufferSize );
-
- ( $uByteOffsetLow[$i], $ivByteOffsetHigh[$i],
- $uStartTimeLow[$i], $ivStartTimeHigh[$i],
- $uEndTimeLog[$i], $ivEndTimeHigh[$i],
- $hVirtualAddress[$i], $ucBytes[$i],
- $uDeviceNumber[$i], $bWasReading[$i] )=
- unpack( "x".(8+8+8+4+4+1+1+2)." L l L l L l L L C c x2", $pLogBuffer );
-
-=item DISK_LOGGING_BINNING
-
-Keep statics grouped into bins based on request sizes.
-
- $pInBuf= pack( "C P L", 3, $pUnknown, $uUnknownSize );
-
-=back
-
-=item C<IOCTL_DISK_FORMAT_TRACKS_EX>
-
-No documentation on this IOCTL is included.
-
-=item C<IOCTL_DISK_HISTOGRAM_STRUCTURE>
-
-No documentation on this IOCTL is included.
-
-=item C<IOCTL_DISK_HISTOGRAM_DATA>
-
-No documentation on this IOCTL is included.
-
-=item C<IOCTL_DISK_HISTOGRAM_RESET>
-
-No documentation on this IOCTL is included.
-
-=item C<IOCTL_DISK_REQUEST_STRUCTURE>
-
-No documentation on this IOCTL operation was found.
-
-=item C<IOCTL_DISK_REQUEST_DATA>
-
-No documentation on this IOCTL operation was found.
-
-=back
-
-=item C<":FSCTL_">
-
-File system control operations. Used in the C<$uIoControlCode>
-argument to C<DeviceIoControl>.
-
-Includes C<FSCTL_SET_REPARSE_POINT>, C<FSCTL_GET_REPARSE_POINT>,
-C<FSCTL_DELETE_REPARSE_POINT>.
-
-=over
-
-=item C<FSCTL_SET_REPARSE_POINT>
-
-Sets reparse point data to be associated with $hDevice.
-
-=item C<FSCTL_GET_REPARSE_POINT>
-
-Retrieves the reparse point data associated with $hDevice.
-
-=item C<FSCTL_DELETE_REPARSE_POINT>
-
-Deletes the reparse point data associated with $hDevice.
-
-=back
-
-=item C<":GENERIC_">
-
-Constants specifying generic access permissions that are not specific
-to one type of object.
-
- GENERIC_ALL GENERIC_EXECUTE
- GENERIC_READ GENERIC_WRITE
-
-=item C<":MEDIA_TYPE">
-
-Different classes of media that a device can support. Used in the
-C<$uMediaType> field of a C<DISK_GEOMETRY> structure.
-
-=over
-
-=item C<Unknown>
-
-Format is unknown.
-
-=item C<F5_1Pt2_512>
-
-5.25" floppy, 1.2MB [really 1,200KB] total space, 512 bytes/sector.
-
-=item C<F3_1Pt44_512>
-
-3.5" floppy, 1.44MB [really 1,440KB] total space, 512 bytes/sector.
-
-=item C<F3_2Pt88_512>
-
-3.5" floppy, 2.88MB [really 2,880KB] total space, 512 bytes/sector.
-
-=item C<F3_20Pt8_512>
-
-3.5" floppy, 20.8MB total space, 512 bytes/sector.
-
-=item C<F3_720_512>
-
-3.5" floppy, 720KB total space, 512 bytes/sector.
-
-=item C<F5_360_512>
-
-5.25" floppy, 360KB total space, 512 bytes/sector.
-
-=item C<F5_320_512>
-
-5.25" floppy, 320KB total space, 512 bytes/sector.
-
-=item C<F5_320_1024>
-
-5.25" floppy, 320KB total space, 1024 bytes/sector.
-
-=item C<F5_180_512>
-
-5.25" floppy, 180KB total space, 512 bytes/sector.
-
-=item C<F5_160_512>
-
-5.25" floppy, 160KB total space, 512 bytes/sector.
-
-=item C<RemovableMedia>
-
-Some type of removable media other than a floppy diskette.
-
-=item C<FixedMedia>
-
-A fixed hard disk.
-
-=item C<F3_120M_512>
-
-3.5" floppy, 120MB total space.
-
-=back
-
-=item C<":MOVEFILE_">
-
-Constants for use in C<$uFlags> arguments to C<MoveFileEx>.
-
- MOVEFILE_COPY_ALLOWED MOVEFILE_DELAY_UNTIL_REBOOT
- MOVEFILE_REPLACE_EXISTING MOVEFILE_WRITE_THROUGH
-
-=item C<":SECURITY_">
-
-Security quality of service values that can be used in the C<$uFlags>
-argument to C<CreateFile> if opening the client side of a named pipe.
-
- SECURITY_ANONYMOUS SECURITY_CONTEXT_TRACKING
- SECURITY_DELEGATION SECURITY_EFFECTIVE_ONLY
- SECURITY_IDENTIFICATION SECURITY_IMPERSONATION
- SECURITY_SQOS_PRESENT
-
-=item C<":SEM_">
-
-Constants to be used with C<SetErrorMode>.
-
- SEM_FAILCRITICALERRORS SEM_NOGPFAULTERRORBOX
- SEM_NOALIGNMENTFAULTEXCEPT SEM_NOOPENFILEERRORBOX
-
-=item C<":PARTITION_">
-
-Constants describing partition types.
-
- PARTITION_ENTRY_UNUSED PARTITION_FAT_12
- PARTITION_XENIX_1 PARTITION_XENIX_2
- PARTITION_FAT_16 PARTITION_EXTENDED
- PARTITION_HUGE PARTITION_IFS
- PARTITION_FAT32 PARTITION_FAT32_XINT13
- PARTITION_XINT13 PARTITION_XINT13_EXTENDED
- PARTITION_PREP PARTITION_UNIX
- VALID_NTFT PARTITION_NTFT
-
-=item C<":ALL">
-
-All of the above.
-
-=back
-
-=head1 BUGS
-
-None known at this time.
-
-=head1 AUTHOR
-
-Tye McQueen, tye@metronet.com, http://www.metronet.com/~tye/.
-
-=head1 SEE ALSO
-
-The pyramids.
-
-=cut
diff --git a/win32/ext/Win32API/File/File.xs b/win32/ext/Win32API/File/File.xs
deleted file mode 100644
index 7dbe783c0e..0000000000
--- a/win32/ext/Win32API/File/File.xs
+++ /dev/null
@@ -1,647 +0,0 @@
-/* Win32API/File.xs */
-
-#include "EXTERN.h"
-#include "perl.h"
-#include "XSUB.h"
-/*#include "patchlevel.h"*/
-
-/* Uncomment the next line unless set "WRITE_PERL=>1" in Makefile.PL: */
-#define NEED_newCONSTSUB
-#include "ppport.h"
-
-#ifdef WORD
-# undef WORD
-#endif
-
-#define WIN32_LEAN_AND_MEAN /* Tell windows.h to skip much */
-#include <windows.h>
-#include <winioctl.h>
-
-/*CONSTS_DEFINED*/
-
-#ifndef INVALID_SET_FILE_POINTER
-# define INVALID_SET_FILE_POINTER ((DWORD)-1)
-#endif
-
-#define oDWORD DWORD
-
-#if (PERL_REVISION <= 5 && PERL_VERSION < 5) || defined(__CYGWIN__)
-# define win32_get_osfhandle _get_osfhandle
-# ifdef __CYGWIN__
-# define win32_open_osfhandle(handle,mode) \
- (Perl_croak(aTHX_ "_open_osfhandle not implemented on Cygwin!"), -1)
-# else
-# define win32_open_osfhandle _open_osfhandle
-# endif
-# ifdef _get_osfhandle
-# undef _get_osfhandle /* stolen_get_osfhandle() isn't available here */
-# endif
-# ifdef _open_osfhandle
-# undef _open_osfhandle /* stolen_open_osfhandle() isn't available here */
-# endif
-#endif
-
-#ifndef XST_mUV
-# define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) )
-#endif
-
-#ifndef XSRETURN_UV
-# define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END
-#endif
-
-#ifndef DEBUGGING
-# define Debug(list) /*Nothing*/
-#else
-# define Debug(list) ErrPrintf list
-# include <stdarg.h>
- static void
- ErrPrintf( const char *sFmt, ... )
- {
- va_list pAList;
- static char *sEnv= NULL;
- DWORD uErr= GetLastError();
- if( NULL == sEnv ) {
- if( NULL == ( sEnv= getenv("DEBUG_WIN32API_FILE") ) )
- sEnv= "";
- }
- if( '\0' == *sEnv )
- return;
- va_start( pAList, sFmt );
- vfprintf( stderr, sFmt, pAList );
- va_end( pAList );
- SetLastError( uErr );
- }
-#endif /* DEBUGGING */
-
-
-#include "buffers.h" /* Include this after DEBUGGING setup finished */
-
-static LONG uLastFileErr= 0;
-
-static void
-SaveErr( BOOL bFailed )
-{
- if( bFailed ) {
- uLastFileErr= GetLastError();
- }
-}
-
-MODULE = Win32API::File PACKAGE = Win32API::File
-
-PROTOTYPES: DISABLE
-
-
-LONG
-_fileLastError( uError=0 )
- DWORD uError
- CODE:
- if( 1 <= items ) {
- uLastFileErr= uError;
- }
- RETVAL= uLastFileErr;
- OUTPUT:
- RETVAL
-
-
-BOOL
-CloseHandle( hObject )
- HANDLE hObject
- CODE:
- RETVAL = CloseHandle( hObject );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-BOOL
-CopyFileA( sOldFileName, sNewFileName, bFailIfExists )
- char * sOldFileName
- char * sNewFileName
- BOOL bFailIfExists
- CODE:
- RETVAL = CopyFileA( sOldFileName, sNewFileName, bFailIfExists );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-BOOL
-CopyFileW( swOldFileName, swNewFileName, bFailIfExists )
- WCHAR * swOldFileName
- WCHAR * swNewFileName
- BOOL bFailIfExists
- CODE:
- RETVAL = CopyFileW( swOldFileName, swNewFileName, bFailIfExists );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-HANDLE
-CreateFileA( sPath, uAccess, uShare, pSecAttr, uCreate, uFlags, hModel )
- char * sPath
- DWORD uAccess
- DWORD uShare
- void * pSecAttr
- DWORD uCreate
- DWORD uFlags
- HANDLE hModel
- CODE:
- RETVAL= CreateFileA( sPath, uAccess, uShare,
- pSecAttr, uCreate, uFlags, hModel );
- if( INVALID_HANDLE_VALUE == RETVAL ) {
- SaveErr( 1 );
- XSRETURN_NO;
- } else if( 0 == RETVAL ) {
- XSRETURN_PV( "0 but true" );
- } else {
- XSRETURN_UV( PTR2UV(RETVAL) );
- }
-
-
-HANDLE
-CreateFileW( swPath, uAccess, uShare, pSecAttr, uCreate, uFlags, hModel )
- WCHAR * swPath
- DWORD uAccess
- DWORD uShare
- void * pSecAttr
- DWORD uCreate
- DWORD uFlags
- HANDLE hModel
- CODE:
- RETVAL= CreateFileW( swPath, uAccess, uShare,
- pSecAttr, uCreate, uFlags, hModel );
- if( INVALID_HANDLE_VALUE == RETVAL ) {
- SaveErr( 1 );
- XSRETURN_NO;
- } else if( 0 == RETVAL ) {
- XSRETURN_PV( "0 but true" );
- } else {
- XSRETURN_UV( PTR2UV(RETVAL) );
- }
-
-
-BOOL
-DefineDosDeviceA( uFlags, sDosDeviceName, sTargetPath )
- DWORD uFlags
- char * sDosDeviceName
- char * sTargetPath
- CODE:
- RETVAL = DefineDosDeviceA( uFlags, sDosDeviceName, sTargetPath );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-BOOL
-DefineDosDeviceW( uFlags, swDosDeviceName, swTargetPath )
- DWORD uFlags
- WCHAR * swDosDeviceName
- WCHAR * swTargetPath
- CODE:
- RETVAL = DefineDosDeviceW( uFlags, swDosDeviceName, swTargetPath );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-BOOL
-DeleteFileA( sFileName )
- char * sFileName
- CODE:
- RETVAL = DeleteFileA( sFileName );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-BOOL
-DeleteFileW( swFileName )
- WCHAR * swFileName
- CODE:
- RETVAL = DeleteFileW( swFileName );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-BOOL
-DeviceIoControl( hDevice, uIoControlCode, pInBuf, lInBuf, opOutBuf, lOutBuf, olRetBytes, pOverlapped )
- HANDLE hDevice
- DWORD uIoControlCode
- char * pInBuf
- DWORD lInBuf = init_buf_l($arg);
- char * opOutBuf = NO_INIT
- DWORD lOutBuf = init_buf_l($arg);
- oDWORD &olRetBytes
- void * pOverlapped
- CODE:
- if( NULL != pInBuf ) {
- if( 0 == lInBuf ) {
- lInBuf= SvCUR(ST(2));
- } else if( SvCUR(ST(2)) < lInBuf ) {
- croak( "%s: pInBuf shorter than specified (%d < %d)",
- "Win32API::File::DeviceIoControl", SvCUR(ST(2)), lInBuf );
- }
- }
- grow_buf_l( opOutBuf,ST(4),char *, lOutBuf,ST(5) );
- RETVAL= DeviceIoControl( hDevice, uIoControlCode, pInBuf, lInBuf,
- opOutBuf, lOutBuf, &olRetBytes, pOverlapped );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
- opOutBuf trunc_buf_l( RETVAL, opOutBuf,ST(4), olRetBytes );
- olRetBytes
-
-
-HANDLE
-FdGetOsFHandle( ivFd )
- int ivFd
- CODE:
- RETVAL= (HANDLE) win32_get_osfhandle( ivFd );
- SaveErr( INVALID_HANDLE_VALUE == RETVAL );
- OUTPUT:
- RETVAL
-
-
-DWORD
-GetDriveTypeA( sRootPath )
- char * sRootPath
- CODE:
- RETVAL = GetDriveTypeA( sRootPath );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-DWORD
-GetDriveTypeW( swRootPath )
- WCHAR * swRootPath
- CODE:
- RETVAL = GetDriveTypeW( swRootPath );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-DWORD
-GetFileAttributesA( sPath )
- char * sPath
- CODE:
- RETVAL = GetFileAttributesA( sPath );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-DWORD
-GetFileAttributesW( swPath )
- WCHAR * swPath
- CODE:
- RETVAL = GetFileAttributesW( swPath );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-DWORD
-GetFileType( hFile )
- HANDLE hFile
- CODE:
- RETVAL = GetFileType( hFile );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-BOOL
-GetHandleInformation( hObject, ouFlags )
- HANDLE hObject
- oDWORD * ouFlags
- CODE:
- RETVAL = GetHandleInformation( hObject, ouFlags );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
- ouFlags
-
-
-DWORD
-GetLogicalDrives()
- CODE:
- RETVAL = GetLogicalDrives();
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-DWORD
-GetLogicalDriveStringsA( lBufSize, osBuffer )
- DWORD lBufSize = init_buf_l($arg);
- char * osBuffer = NO_INIT
- CODE:
- grow_buf_l( osBuffer,ST(1),char *, lBufSize,ST(0) );
- RETVAL= GetLogicalDriveStringsA( lBufSize, osBuffer );
- if( lBufSize < RETVAL && autosize(ST(0)) ) {
- lBufSize= RETVAL;
- grow_buf_l( osBuffer,ST(1),char *, lBufSize,ST(0) );
- RETVAL= GetLogicalDriveStringsA( lBufSize, osBuffer );
- }
- if( 0 == RETVAL || lBufSize < RETVAL ) {
- SaveErr( 1 );
- } else {
- trunc_buf_l( 1, osBuffer,ST(1), RETVAL );
- }
- OUTPUT:
- RETVAL
- osBuffer ;/* The code for this appears above. */
-
-
-DWORD
-GetLogicalDriveStringsW( lwBufSize, oswBuffer )
- DWORD lwBufSize = init_buf_lw($arg);
- WCHAR * oswBuffer = NO_INIT
- CODE:
- grow_buf_lw( oswBuffer,ST(1), lwBufSize,ST(0) );
- RETVAL= GetLogicalDriveStringsW( lwBufSize, oswBuffer );
- if( lwBufSize < RETVAL && autosize(ST(0)) ) {
- lwBufSize= RETVAL;
- grow_buf_lw( oswBuffer,ST(1), lwBufSize,ST(0) );
- RETVAL= GetLogicalDriveStringsW( lwBufSize, oswBuffer );
- }
- if( 0 == RETVAL || lwBufSize < RETVAL ) {
- SaveErr( 1 );
- } else {
- trunc_buf_lw( 1, oswBuffer,ST(1), RETVAL );
- }
- OUTPUT:
- RETVAL
- oswBuffer ;/* The code for this appears above. */
-
-
-BOOL
-GetVolumeInformationA( sRootPath, osVolName, lVolName, ouSerialNum, ouMaxNameLen, ouFsFlags, osFsType, lFsType )
- char * sRootPath
- char * osVolName = NO_INIT
- DWORD lVolName = init_buf_l($arg);
- oDWORD &ouSerialNum = optUV($arg);
- oDWORD &ouMaxNameLen = optUV($arg);
- oDWORD &ouFsFlags = optUV($arg);
- char * osFsType = NO_INIT
- DWORD lFsType = init_buf_l($arg);
- CODE:
- grow_buf_l( osVolName,ST(1),char *, lVolName,ST(2) );
- grow_buf_l( osFsType,ST(6),char *, lFsType,ST(7) );
- RETVAL= GetVolumeInformationA( sRootPath, osVolName, lVolName,
- &ouSerialNum, &ouMaxNameLen, &ouFsFlags, osFsType, lFsType );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
- osVolName trunc_buf_z( RETVAL, osVolName,ST(1) );
- osFsType trunc_buf_z( RETVAL, osFsType,ST(6) );
- ouSerialNum
- ouMaxNameLen
- ouFsFlags
-
-
-BOOL
-GetVolumeInformationW( swRootPath, oswVolName, lwVolName, ouSerialNum, ouMaxNameLen, ouFsFlags, oswFsType, lwFsType )
- WCHAR * swRootPath
- WCHAR * oswVolName = NO_INIT
- DWORD lwVolName = init_buf_lw($arg);
- oDWORD &ouSerialNum = optUV($arg);
- oDWORD &ouMaxNameLen = optUV($arg);
- oDWORD &ouFsFlags = optUV($arg);
- WCHAR * oswFsType = NO_INIT
- DWORD lwFsType = init_buf_lw($arg);
- CODE:
- grow_buf_lw( oswVolName,ST(1), lwVolName,ST(2) );
- grow_buf_lw( oswFsType,ST(6), lwFsType,ST(7) );
- RETVAL= GetVolumeInformationW( swRootPath, oswVolName, lwVolName,
- &ouSerialNum, &ouMaxNameLen, &ouFsFlags, oswFsType, lwFsType );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
- oswVolName trunc_buf_zw( RETVAL, oswVolName,ST(1) );
- oswFsType trunc_buf_zw( RETVAL, oswFsType,ST(6) );
- ouSerialNum
- ouMaxNameLen
- ouFsFlags
-
-
-BOOL
-IsRecognizedPartition( ivPartitionType )
- int ivPartitionType
- CODE:
- RETVAL = IsRecognizedPartition( ivPartitionType );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-BOOL
-IsContainerPartition( ivPartitionType )
- int ivPartitionType
- CODE:
- RETVAL = IsContainerPartition( ivPartitionType );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-BOOL
-MoveFileA( sOldName, sNewName )
- char * sOldName
- char * sNewName
- CODE:
- RETVAL = MoveFileA( sOldName, sNewName );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-BOOL
-MoveFileW( swOldName, swNewName )
- WCHAR * swOldName
- WCHAR * swNewName
- CODE:
- RETVAL = MoveFileW( swOldName, swNewName );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-BOOL
-MoveFileExA( sOldName, sNewName, uFlags )
- char * sOldName
- char * sNewName
- DWORD uFlags
- CODE:
- RETVAL = MoveFileExA( sOldName, sNewName, uFlags );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-BOOL
-MoveFileExW( swOldName, swNewName, uFlags )
- WCHAR * swOldName
- WCHAR * swNewName
- DWORD uFlags
- CODE:
- RETVAL = MoveFileExW( swOldName, swNewName, uFlags );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-long
-OsFHandleOpenFd( hOsFHandle, uMode )
- long hOsFHandle
- DWORD uMode
- CODE:
- RETVAL= win32_open_osfhandle( hOsFHandle, uMode );
- if( RETVAL < 0 ) {
- SaveErr( 1 );
- XSRETURN_NO;
- } else if( 0 == RETVAL ) {
- XSRETURN_PV( "0 but true" );
- } else {
- XSRETURN_IV( (IV) RETVAL );
- }
-
-
-DWORD
-QueryDosDeviceA( sDeviceName, osTargetPath, lTargetBuf )
- char * sDeviceName
- char * osTargetPath = NO_INIT
- DWORD lTargetBuf = init_buf_l($arg);
- CODE:
- grow_buf_l( osTargetPath,ST(1),char *, lTargetBuf,ST(2) );
- RETVAL= QueryDosDeviceA( sDeviceName, osTargetPath, lTargetBuf );
- SaveErr( 0 == RETVAL );
- OUTPUT:
- RETVAL
- osTargetPath trunc_buf_l( 1, osTargetPath,ST(1), RETVAL );
-
-
-DWORD
-QueryDosDeviceW( swDeviceName, oswTargetPath, lwTargetBuf )
- WCHAR * swDeviceName
- WCHAR * oswTargetPath = NO_INIT
- DWORD lwTargetBuf = init_buf_lw($arg);
- CODE:
- grow_buf_lw( oswTargetPath,ST(1), lwTargetBuf,ST(2) );
- RETVAL= QueryDosDeviceW( swDeviceName, oswTargetPath, lwTargetBuf );
- SaveErr( 0 == RETVAL );
- OUTPUT:
- RETVAL
- oswTargetPath trunc_buf_lw( 1, oswTargetPath,ST(1), RETVAL );
-
-
-BOOL
-ReadFile( hFile, opBuffer, lBytes, olBytesRead, pOverlapped )
- HANDLE hFile
- BYTE * opBuffer = NO_INIT
- DWORD lBytes = init_buf_l($arg);
- oDWORD &olBytesRead
- void * pOverlapped
- CODE:
- grow_buf_l( opBuffer,ST(1),BYTE *, lBytes,ST(2) );
- /* Don't read more bytes than asked for if buffer is already big: */
- lBytes= init_buf_l(ST(2));
- if( 0 == lBytes && autosize(ST(2)) ) {
- lBytes= SvLEN( ST(1) ) - 1;
- }
- RETVAL= ReadFile( hFile, opBuffer, lBytes, &olBytesRead, pOverlapped );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
- opBuffer trunc_buf_l( RETVAL, opBuffer,ST(1), olBytesRead );
- olBytesRead
-
-
-BOOL
-GetOverlappedResult( hFile, lpOverlapped, lpNumberOfBytesTransferred, bWait)
- HANDLE hFile
- LPOVERLAPPED lpOverlapped
- LPDWORD lpNumberOfBytesTransferred
- BOOL bWait
- CODE:
- RETVAL= GetOverlappedResult( hFile, lpOverlapped,
- lpNumberOfBytesTransferred, bWait);
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
- lpOverlapped
- lpNumberOfBytesTransferred
-
-DWORD
-GetFileSize( hFile, lpFileSizeHigh )
- HANDLE hFile
- LPDWORD lpFileSizeHigh
- CODE:
- RETVAL= GetFileSize( hFile, lpFileSizeHigh );
- SaveErr( NO_ERROR != GetLastError() );
- OUTPUT:
- RETVAL
- lpFileSizeHigh
-
-UINT
-SetErrorMode( uNewMode )
- UINT uNewMode
-
-
-LONG
-SetFilePointer( hFile, ivOffset, ioivOffsetHigh, uFromWhere )
- HANDLE hFile
- LONG ivOffset
- LONG * ioivOffsetHigh
- DWORD uFromWhere
- CODE:
- RETVAL= SetFilePointer( hFile, ivOffset, ioivOffsetHigh, uFromWhere );
- if( RETVAL == INVALID_SET_FILE_POINTER && (GetLastError() != NO_ERROR) ) {
- SaveErr( 1 );
- XST_mNO(0);
- } else if( 0 == RETVAL ) {
- XST_mPV(0,"0 but true");
- } else {
- XST_mIV(0,RETVAL);
- }
- OUTPUT:
- ioivOffsetHigh
-
-
-BOOL
-SetHandleInformation( hObject, uMask, uFlags )
- HANDLE hObject
- DWORD uMask
- DWORD uFlags
- CODE:
- RETVAL = SetHandleInformation( hObject, uMask, uFlags );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
-
-
-BOOL
-WriteFile( hFile, pBuffer, lBytes, ouBytesWritten, pOverlapped )
- HANDLE hFile
- BYTE * pBuffer
- DWORD lBytes = init_buf_l($arg);
- oDWORD &ouBytesWritten
- void * pOverlapped
- CODE:
- /* SvCUR(ST(1)) might "panic" if pBuffer isn't valid */
- if( 0 == lBytes ) {
- lBytes= SvCUR(ST(1));
- } else if( SvCUR(ST(1)) < lBytes ) {
- croak( "%s: pBuffer value too short (%d < %d)",
- "Win32API::File::WriteFile", SvCUR(ST(1)), lBytes );
- }
- RETVAL= WriteFile( hFile, pBuffer, lBytes,
- &ouBytesWritten, pOverlapped );
- SaveErr( !RETVAL );
- OUTPUT:
- RETVAL
- ouBytesWritten
diff --git a/win32/ext/Win32API/File/Makefile.PL b/win32/ext/Win32API/File/Makefile.PL
deleted file mode 100644
index c84d1de4cd..0000000000
--- a/win32/ext/Win32API/File/Makefile.PL
+++ /dev/null
@@ -1,127 +0,0 @@
-#!/usr/bin/perl -w
-use ExtUtils::MakeMaker;
-use Config;
-use strict;
-# See lib/ExtUtils/MakeMaker.pm for details of how to influence
-# the contents of the Makefile that is written.
-WriteMakefile(
- 'NAME' => 'Win32API::File',
- 'VERSION_FROM' => 'File.pm', # finds $VERSION
- ( $Config{archname} =~ /-object\b/i ? ( 'CAPI' => 'TRUE' ) : () ),
- ( $] < 5.005 ? () :
- ( 'AUTHOR' => 'Tye McQueen <tye@metronet.com>',
- 'ABSTRACT_FROM' => 'File.pm' )
- ),
- 'postamble' => { IMPORT_LIST => [qw(/._/ !/[a-z]/ :MEDIA_TYPE)],
- IFDEF => "!/[a-z\\d]/",
- CPLUSPLUS => 1,
- WRITE_PERL => 1,
- # Comment out next line to rebuild constants defs:
- NO_REBUILD => 1,
- },
- ( ! $Config{libperl} ? () : ( LIBPERL_A => $Config{libperl} ) ),
-);
-
-# Replacement for MakeMaker's "const2perl section" for versions
-# of MakeMaker prior to the addition of this functionality:
-sub MY::postamble
-{
- my( $self, %attribs )= @_;
-
- # Don't do anything if MakeMaker has const2perl
- # that already took care of all of this:
- return unless %attribs;
-
- # Don't require these here if we just C<return> above:
- eval "use ExtUtils::Myconst2perl qw(ParseAttribs); 1" or die "$@";
- eval "use ExtUtils::MakeMaker qw(neatvalue); 1" or die "$@";
-
- # If only one module, can skip one level of indirection:
- my $hvAttr= \%attribs;
- if( $attribs{IMPORT_LIST} ) {
- $hvAttr= { $self->{NAME} => \%attribs };
- }
-
- my( $module, @m, $_final, @clean, @realclean );
- foreach $module ( keys %$hvAttr ) {
- my( $outfile, @perlfiles, @cfiles, $bin, $obj, $final, $noreb );
-
- # Translate user-friendly options into coder-friendly specifics:
- ParseAttribs( $module, $hvAttr->{$module}, { OUTFILE => \$outfile,
- C_FILE_LIST => \@perlfiles, PERL_FILE_LIST => \@cfiles,
- OBJECT => \$obj, BINARY => \$bin, FINAL_PERL => \$final,
- NO_REBUILD => \$noreb } );
- die "IFDEF option in Makefile.PL must be string, not code ref.\n"
- if ref $hvAttr->{$module}->{IFDEF};
- die qq{IFDEF option in Makefile.PL must not contain quotes (").\n}
- if ref $hvAttr->{$module}->{IFDEF};
-
- # How to create F<$outfile> via ExtUtils::Myconst2perl::Myconst2perl:
- push @m, "
-$outfile: @perlfiles @cfiles Makefile" . '
- $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Myconst2perl \\
- -e "my %attribs;" \\
- ';
- $m[-1] =~ s/^/##/gm if $noreb;
- my( $key, $value );
- while( ( $key, $value )= each %{$hvAttr->{$module}} ) {
- push @m, '-e "$$attribs{' . $key . '}= '
- . neatvalue($value) . qq[;" \\\n\t ];
- $m[-1] =~ s/^/##/gm if $noreb;
- }
- push @m, '-e "Myconst2perl(' . neatvalue($module) . ",%attribs)\"\n";
-
- # If requested extra work to generate Perl instead of XS code:
- if( $bin ) {
- my @path= split /::/, $module;
- my $_final= $final;
- $_final =~ s/\W/_/g;
-
- # How to compile F<$outfile> and then run it to produce F<$final>:
- push @m, "
-$bin: $outfile" . '
- $(CC) $(INC) $(CCFLAGS) $(OPTIMIZE) $(PERLTYPE) $(LARGE) \\
- $(SPLIT) $(DEFINE_VERSION) $(XS_DEFINE_VERSION) -I$(PERL_INC) \\
- $(DEFINE)' . $outfile . " "
- . $self->catfile(qw[ $(PERL_INC) $(LIBPERL_A) ]) . " -o $bin
-
-$final: $bin
- " . $self->catfile(".",$bin) . " >$final\n";
- $m[-1] =~ s/^/##/gm if $noreb;
-
- # Make sure the rarely-used $(INST_ARCHLIB) directory exists:
- push @m, $self->dir_target('$(INST_ARCHLIB)');
-
- ##warn qq{$path[-1].pm should C<require "},
- ## join("/",@path,$final), qq{">.\n};
- # Install F<$final> whenever regular pm_to_blib target is built:
- push @m, "
-pm_to_blib: ${_final}_to_blib
-
-${_final}_to_blib: $final
- " . '@$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \\
- "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \\
- -e "pm_to_blib({ ',neatvalue($final),',',
- neatvalue($self->catfile('$(INST_ARCHLIB)',@path,$final)), ' },',
- neatvalue($self->catfile(qw[$(INST_LIB) auto])), ')"
- @$(TOUCH) ', $_final, "_to_blib\n";
-
- push( @clean, $outfile, $bin, $obj, $_final . "_to_blib" );
- push( @realclean, $final ) unless $noreb;
- } else {
-
- ##my $name= ( split /::/, $module )[-1];
- ##warn qq{$name.xs should C<#include "$final"> },
- ## qq{in the C<BOOT:> section\n};
- push( @realclean, $outfile ) unless $noreb;
- }
- }
-
- push @m, "
-clean ::
- $self->{RM_F} @clean\n" if @clean;
- push @m, "
-realclean ::
- $self->{RM_F} @realclean\n" if @realclean;
- return join('',@m);
-}
diff --git a/win32/ext/Win32API/File/README b/win32/ext/Win32API/File/README
deleted file mode 100644
index c460844d4d..0000000000
--- a/win32/ext/Win32API/File/README
+++ /dev/null
@@ -1,133 +0,0 @@
-Win32API::File v0.08 -- Low-level access to Win32 API calls for files.
-
-New since v0.07:
-
- GetHandleInformation SetHandleInformation
- HANDLE_FLAG_INHERIT HANDLE_FLAG_PROTECT_FROM_CLOSE
- fileConstant fileLastError
-
-Low-level and full-power access to the following routines are provided:
-
- CloseHandle CopyFile CreateFile
- DefineDosDevice DeleteFile DeviceIoControl
- GetDriveType GetFileType GetHandleInformation
- GetLogicalDrives GetLogicalDriveStrings GetVolumeInformation
- IsRecognizedPartition IsContainerPartition MoveFile
- MoveFileEx QueryDosDevice ReadFile
- SetFilePointer SetErrorMode SetHandleInformation
- WriteFile
-
-Plus the Unicode versions:
-
- CopyFileW CreateFileW DefineDosDeviceW
- DeleteFileW GetDriveTypeW GetLogicalDriveStringsW
- GetVolumeInformationW MoveFileW MoveFileExW
- QueryDosDeviceW
-
-Full conversion between Win32-native file handles and Perl file handles is
-also supported. Access to the following C run-time library routines [or at
-least the Perl run-time library wrappers for them] is provided:
-
- _get_osfhandle or win32_get_osfhandle as FdGetOsFHandle
- _open_osfhandle or win32_open_osfhandle as OsFHandleOpenFd
-
-The following Perl-friendly wrappers and helper functions are also provided:
-
- OsFHandleOpen GetOsFHandle attrLetsToBits
- createFile fileConstant fileLastError
- getLogicalDrives
-
-Plus the following constants:
-
- CREATE_ALWAYS CREATE_NEW FILE_BEGIN
- FILE_CURRENT FILE_END INVALID_HANDLE_VALUE
- OPEN_ALWAYS OPEN_EXISTING TRUNCATE_EXISTING
-
- DDD_EXACT_MATCH_ON_REMOVE DDD_RAW_TARGET_PATH
- DDD_REMOVE_DEFINITION
-
- DRIVE_UNKNOWN DRIVE_NO_ROOT_DIR DRIVE_REMOVABLE
- DRIVE_FIXED DRIVE_REMOTE DRIVE_CDROM
- DRIVE_RAMDISK
-
- FILE_READ_DATA FILE_LIST_DIRECTORY
- FILE_WRITE_DATA FILE_ADD_FILE
- FILE_APPEND_DATA FILE_ADD_SUBDIRECTORY
- FILE_CREATE_PIPE_INSTANCE FILE_READ_EA
- FILE_WRITE_EA FILE_EXECUTE
- FILE_TRAVERSE FILE_DELETE_CHILD
- FILE_READ_ATTRIBUTES FILE_WRITE_ATTRIBUTES
- FILE_ALL_ACCESS FILE_GENERIC_READ
- FILE_GENERIC_WRITE FILE_GENERIC_EXECUTE
-
- FILE_ATTRIBUTE_ARCHIVE FILE_ATTRIBUTE_COMPRESSED
- FILE_ATTRIBUTE_HIDDEN FILE_ATTRIBUTE_NORMAL
- FILE_ATTRIBUTE_OFFLINE FILE_ATTRIBUTE_READONLY
- FILE_ATTRIBUTE_SYSTEM FILE_ATTRIBUTE_TEMPORARY
-
- FILE_FLAG_BACKUP_SEMANTICS FILE_FLAG_DELETE_ON_CLOSE
- FILE_FLAG_NO_BUFFERING FILE_FLAG_OVERLAPPED
- FILE_FLAG_POSIX_SEMANTICS FILE_FLAG_RANDOM_ACCESS
- FILE_FLAG_SEQUENTIAL_SCAN FILE_FLAG_WRITE_THROUGH
-
- FILE_SHARE_DELETE FILE_SHARE_READ FILE_SHARE_WRITE
-
- FILE_TYPE_CHAR FILE_TYPE_DISK FILE_TYPE_PIPE
- FILE_TYPE_UNKNOWN
-
- FS_CASE_IS_PRESERVED FS_CASE_SENSITIVE
- FS_UNICODE_STORED_ON_DISK FS_PERSISTENT_ACLS
- FS_FILE_COMPRESSION FS_VOL_IS_COMPRESSED
-
- HANDLE_FLAG_INHERIT HANDLE_FLAG_PROTECT_FROM_CLOSE
-
- IOCTL_STORAGE_CHECK_VERIFY IOCTL_STORAGE_MEDIA_REMOVAL
- IOCTL_STORAGE_EJECT_MEDIA IOCTL_STORAGE_LOAD_MEDIA
- IOCTL_STORAGE_RESERVE IOCTL_STORAGE_RELEASE
- IOCTL_STORAGE_FIND_NEW_DEVICES IOCTL_STORAGE_GET_MEDIA_TYPES
-
- IOCTL_DISK_GET_DRIVE_GEOMETRY IOCTL_DISK_GET_PARTITION_INFO
- IOCTL_DISK_SET_PARTITION_INFO IOCTL_DISK_GET_DRIVE_LAYOUT
- IOCTL_DISK_SET_DRIVE_LAYOUT IOCTL_DISK_VERIFY
- IOCTL_DISK_FORMAT_TRACKS IOCTL_DISK_REASSIGN_BLOCKS
- IOCTL_DISK_PERFORMANCE IOCTL_DISK_IS_WRITABLE
- IOCTL_DISK_LOGGING IOCTL_DISK_FORMAT_TRACKS_EX
- IOCTL_DISK_HISTOGRAM_STRUCTURE IOCTL_DISK_HISTOGRAM_DATA
- IOCTL_DISK_HISTOGRAM_RESET IOCTL_DISK_REQUEST_STRUCTURE
- IOCTL_DISK_REQUEST_DATA
-
- GENERIC_ALL GENERIC_EXECUTE
- GENERIC_READ GENERIC_WRITE
-
- Unknown F5_1Pt2_512 F3_1Pt44_512
- F3_2Pt88_512 F3_20Pt8_512 F3_720_512
- F5_360_512 F5_320_512 F5_320_1024
- F5_180_512 F5_160_512 RemovableMedia
- FixedMedia F3_120M_512
-
- MOVEFILE_COPY_ALLOWED MOVEFILE_DELAY_UNTIL_REBOOT
- MOVEFILE_REPLACE_EXISTING MOVEFILE_WRITE_THROUGH
-
- SECURITY_ANONYMOUS SECURITY_CONTEXT_TRACKING
- SECURITY_DELEGATION SECURITY_EFFECTIVE_ONLY
- SECURITY_IDENTIFICATION SECURITY_IMPERSONATION
- SECURITY_SQOS_PRESENT
-
- SEM_FAILCRITICALERRORS SEM_NOGPFAULTERRORBOX
- SEM_NOALIGNMENTFAULTEXCEPT SEM_NOOPENFILEERRORBOX
-
- PARTITION_ENTRY_UNUSED PARTITION_FAT_12
- PARTITION_XENIX_1 PARTITION_XENIX_2
- PARTITION_FAT_16 PARTITION_EXTENDED
- PARTITION_HUGE PARTITION_IFS
- PARTITION_FAT32 PARTITION_FAT32_XINT13
- PARTITION_XINT13 PARTITION_XINT13_EXTENDED
- PARTITION_PREP PARTITION_UNIX
- VALID_NTFT PARTITION_NTFT
-
-Comments, additions, and bug reports are welcomed. Please address
-technical questions that are not full bug reports to
-
-http://perlmonks.org/index.pl?node=Seekers%20of%20Perl%20Wisdom
-
-Tye McQueen, tye@metronet.com, http://www.metronet.com/~tye/.
diff --git a/win32/ext/Win32API/File/buffers.h b/win32/ext/Win32API/File/buffers.h
deleted file mode 100644
index 2ae74e690b..0000000000
--- a/win32/ext/Win32API/File/buffers.h
+++ /dev/null
@@ -1,423 +0,0 @@
-/* buffers.h -- Version 1.11 */
-
-/* The following abbreviations are used at start of parameter names
- * to indicate the type of data:
- * s string (char * or WCHAR *) [PV]
- * sw wide string (WCHAR *) [PV]
- * p pointer (usually to some structure) [PV]
- * a array (packed array as in C) (usually of some structure) [PV]
- * called a "vector" or "vect" in some places.
- * n generic number [IV, UV, or NV]
- * iv signed integral value [IV]
- * u unsigned integral value [UV]
- * d floating-point number (double) [NV]
- * b boolean (bool) [IV]
- * c count of items [UV]
- * l length (in bytes) [UV]
- * lw length in WCHARs [UV]
- * h a handle [IV]
- * r record (structure) [PV]
- * sv Perl scalar (s, i, u, d, n, or rv) [SV]
- * rv Perl reference (usually to scalar) [RV]
- * hv reference to Perl hash [HV]
- * av reference to Perl array [AV]
- * cv Perl code reference [PVCV]
- *
- * Unusual combined types:
- * pp single pointer (to non-Perl data) packed into string [PV]
- * pap vector of pointers (to non-Perl data) packed into string [PV]
- *
- * Whether a parameter is for input data, output data, or both is usually
- * not reflected by the data type prefix. In cases where this is not
- * obvious nor reflected in the variable name proper, you can use
- * the following in front of the data type prefix:
- * i an input parameter given to API (usually omitted)
- * o an Output parameter taken from API
- * io Input given to API then overwritten with Output taken from API
- */
-
-/* Buffer arguments are usually followed by an argument (or two) specifying
- * their size and/or returning the size of data written. The size can be
- * measured in bytes ["lSize"] or in characters [for (char *) buffers such as
- * for *A() routines, these sizes are also called "lSize", but are called
- * "lwSize" for (WCHAR *) buffers, UNICODE strings, such as for *W() routines].
- *
- * Before calling the actual C function, you must make sure the Perl variable
- * actually has a big enough buffer allocated, and, if the user didn't want
- * to specify a buffer size, set the buffer size to be correct. This is what
- * the grow_*() macros are for. They also handle special meanings of the
- * buffer size argument [described below].
- *
- * Once the actual C function returns, you must set the Perl variable to know
- * the size of the written data. This is what the trunc_*() macros are for.
- *
- * The size sometimes does and sometimes doesn't include the trailing '\0'
- * [or L'\0'], so we always add or substract 1 in the appropriate places so
- * we don't care about this detail.
- *
- * A call may 1) request a pointer to the buffer size which means that
- * the buffer size will be overwritten with the size of the data written;
- * 2) have an extra argument which is a pointer to the place to write the
- * size of the written data; 3) provide the size of the written data in
- * the function's return value; 4) format the data so that the length
- * can be determined by examining the data [such as with '\0'-terminated
- * strings]; or 5) write fixed-length data [usually sizeof(STRUCT)].
- * This obviously determines what you should use in the trunc_*() macro
- # to specify the size of the output value.
- *
- * The user can pass in an empty list reference, C<[]>, to indicate C<NULL>
- * for the pointer to the buffer which means that they don't want that data.
- *
- * The user can pass in C<[]> or C<0> to indicate that they don't care about
- * the buffer size [we aren't programming in C here, after all] and just try
- * to get the data. This will work if either the buffer already alloated for
- * the SV [scalar value] is large enough to hold the data or the API provides
- * an easy way to determine the required size [and the XS code uses it].
- *
- * If the user passes in a numeric value for a buffer size, then the XS
- * code makes sure that the buffer is at least large enough to hold a value
- * of that size and then passes in how large the buffer is. So the buffer
- * size passed to the API call is the larger of the size requested by the
- * user and the size of the buffer aleady allocated to the SV.
- *
- * The user can also pass in a string consisting of a leading "=" followed
- * by digits for a buffer size. This means just use the size specified after
- * the equals sign, even if the allocated buffer is larger. The XS code will
- * still allocate a large enough buffer before the first call.
- *
- * If the function is nice enough to tell us that a buffer was too small
- * [usually via ERROR_MORE_DATA] _and_ how large the buffer needs to be,
- * then the XS code should enlarge the buffer(s) and repeat the call [once].
- * This resizing is _not_ done for buffers whose size was specified with a
- * leading "=".
- *
- * Only grow_buf() and perhaps trunc_buf() can be used in a typemap file.
- * The other macros would be used in the parameter declarations or INPUT:
- * section [grow_*()], the INIT: section [init_*()], or the OUTPUT: section
- * [trunc_*()].
- *
- * Buffer arguments should be initialied with C<= NO_INIT> [or C<= NULL;>].
- *
- * See also the F<typemap> file. C<oDWORD>, for example, is for an output-
- * only parameter of type C<DWORD> and you should simply C<#define> it to be
- * C<DWORD>. In F<typemap>, C<oDWORD> is treated differently than C<DWORD>
- * in two ways.
- *
- * First, if C<undef> is passed in, a C<DWORD> could generate a warning
- * when it gets converted to 0 while C<oDWORD> will never generate such a
- * warning for C<undef>. This first difference doesn't apply if specific
- * initialization is specified for the variable, as in C<= init_buf_l($var);>.
- * In particular, the init_*() macros also convert C<undef> to 0 without
- * ever producing a warning.
- *
- * Second, passing in a read-only SV for a C<oDWORD> parameter will generate
- * a fatal error on output when we try to update the SV. For C<DWORD>, we
- * won't update a read-only SV since passing in a literal constant for a
- * buffer size is a useful thing to do even though it prevents us from
- * returning the size of data written via that SV. Since we should use a
- * trunc_*() macro to output the actual data, the user should be able to
- * determine the size of data written based on the size of the scalar we
- * output anyway.
- *
- * This second difference doesn't apply unless the paremter is listed in
- * the OUTPUT: section without specific output instructions. We define
- * no macros for outputing buffer length parameters so be careful to use
- * C<oDWORD> [for example] for them if and only if they are output-only.
- *
- * Note that C<oDWORD> is the same as C<DWORD> in that, if a defined value
- * is passed in, it is used [and can generate a warning if the value is
- * "not numeric"]. So although C<oDWORD> is for output-only parameters,
- * we still initialize the C variable before calling the API. This is good
- * in case the parameter isn't always strictly output-only due to upgrades,
- * bugs, etc.
- *
- * Here is a made-up example that shows several cases:
- *
- * # Actual GetDataW() returns length of data written to ioswName, not bool.
- * bool
- * GetDataW( ioswName, ilwName, oswText, iolwText, opJunk, opRec, ilRec, olRec )
- * WCHAR * ioswName = NO_INIT
- * DWORD ilwName = NO_INIT
- * WCHAR * oswText = NO_INIT
- * DWORD &iolwText = init_buf_l($arg);
- * void * opJunk = NO_INIT
- * BYTE * opRec = NO_INIT
- * DWORD ilRec = init_buf_l($arg);
- * oDWORD &olRec
- * PREINIT:
- * DWORD olwName;
- * INIT:
- * grow_buf_lw( ioswName,ST(0), ilwName,ST(1) );
- * grow_buf_lw( oswText,ST(2), iolwText,ST(3) );
- * grow_buf_typ( opJunk,ST(4),void *, LONG_STRUCT_TYPEDEF );
- * grow_buf_l( opRec,ST(5),BYTE *, ilRec,ST(6) );
- * CODE:
- * olwName= GetDataW( ioswName, ilwName, oswText, &iolwText,
- * (LONG_STRUCT_TYPEDEF *)opJunk, opRec, &iolRec );
- * if( 0 == olwName && ERROR_MORE_DATA == GetLastError()
- * && ( autosize(ST(1)) || autosize(ST(3)) || autosize(ST(6)) ) ) {
- * if( autosize(ST(1)) )
- * grow_buf_lw( ioswName,ST(0), ilwName,ST(1) );
- * if( autosize(ST(3)) )
- * grow_buf_lw( oswText,ST(2), iolwText,ST(3) );
- * if( autosize(ST(6)) )
- * grow_buf_l( opRec,ST(5),BYTE *, iolRec,ST(6) );
- * olwName= GetDataW( ioswName, ilwName, oswText, &iolwText,
- * (LONG_STRUCT_TYPEDEF *)opJunk, opRec, &iolRec );
- * }
- * RETVAL= 0 != olwName;
- * OUTPUT:
- * RETVAL
- * ioswName trunc_buf_lw( RETVAL, ioswName,ST(0), olwName );
- * oswText trunc_buf_lw( RETVAL, oswText,ST(2), iolwText );
- * iolwText
- * opJunk trunc_buf_typ(RETVAL,opJunk,ST(4),LONG_STRUCT_TYPEDEF);
- * opRec trunc_buf_l( RETVAL, opRec,ST(5), olRec );
- * olRec
- *
- * The above example would be more complex and less efficient if we used
- * C<DWORD * iolwText> in place of C<DWORD &iolwText>. The only possible
- * advantage would be that C<NULL> would be passed in for C<iolwText> if
- * _both_ C<$oswText> and C<$iolwText> were specified as C<[]>. The *_pl*()
- * macros are defined [and C<DWORD *> specified in F<typemap>] so we can
- * handle those cases but it is usually better to use the *_l*() macros
- * instead by specifying C<&> instead of C<*>. Using C<&> instead of C<*>
- * is usually better when dealing with scalars, even if they aren't buffer
- * sizes. But you must use C<*> if it is important for that parameter to
- * be able to pass C<NULL> to the underlying API.
- *
- * In Win32API::, we try to use C<*> for buffer sizes of optional buffers
- * and C<&> for buffer sizes of required buffers.
- *
- * For parameters that are pointers to things other than buffers or buffer
- * sizes, we use C<*> for "important" parameters [so that using C<[]>
- * generates an error rather than fetching the value and just throwing it
- * away], and for optional parameters [in case specifying C<NULL> is or
- * becomes important]. Otherwise we use C<&> [for "unimportant" but
- * required parameters] so the user can specify C<[]> if they don't care
- * about it. The output handle of an "open" routine is "important".
- */
-
-#ifndef Debug
-# define Debug(list) /*Nothing*/
-#endif
-
-/*#ifndef CAST
- *# ifdef __cplusplus
- *# define CAST(type,expr) static_cast<type>(expr)
- *# else*/
-# define CAST(type,expr) (type)(expr)
-/*# endif
- *#endif*/
-
-/* Is an argument C<[]>, meaning we should pass C<NULL>? */
-#define null_arg(sv) ( SvROK(sv) && SVt_PVAV == SvTYPE(SvRV(sv)) \
- && -1 == av_len((AV*)SvRV(sv)) )
-
-#define PV_or_null(sv) ( null_arg(sv) ? NULL : SvPV(sv,PL_na) )
-
-/* Minimum buffer size to use when no buffer existed: */
-#define MIN_GROW_SIZE 128
-
-#ifdef Debug
-/* Used in Debug() messages to show which macro call is involved: */
-#define string(arg) #arg
-#endif
-
-/* Simplify using SvGROW() for byte-sized buffers: */
-#define lSvGROW(sv,n) SvGROW( sv, 0==(n) ? MIN_GROW_SIZE : (n)+1 )
-
-/* Simplify using SvGROW() for WCHAR-sized buffers: */
-#define lwSvGROW(sv,n) CAST( WCHAR *, \
- SvGROW( sv, sizeof(WCHAR)*( 0==(n) ? MIN_GROW_SIZE : (n)+1 ) ) )
-
-/* Whether the buffer size we got lets us change what buffer size we use: */
-#define autosize(sv) (!( SvOK(sv) && ! SvROK(sv) \
- && SvPV(sv,PL_na) && '=' == *SvPV(sv,PL_na) ))
-
-/* Get the IV/UV for a parameter that might be C<[]> or C<undef>: */
-#define optIV(sv) ( null_arg(sv) ? 0 : !SvOK(sv) ? 0 : SvIV(sv) )
-#define optUV(sv) ( null_arg(sv) ? 0 : !SvOK(sv) ? 0 : SvUV(sv) )
-
-/* Allocate temporary storage that will automatically be freed later: */
-#ifndef TempAlloc /* Can be C<#define>d to be C<_alloca>, for example */
-# define TempAlloc( size ) sv_grow( sv_newmortal(), size )
-#endif
-
-/* Initialize a buffer size argument of type (DWORD *): */
-#define init_buf_pl( plSize, svSize, tpSize ) STMT_START { \
- if( null_arg(svSize) ) \
- plSize= NULL; \
- else { \
- STRLEN n_a; \
- *( plSize= CAST( tpSize, TempAlloc(sizeof(*plSize)) ) )= \
- autosize(svSize) ? optUV(svSize) \
- : strtoul( 1+SvPV(svSize,n_a), NULL, 10 ); \
- } } STMT_END
-/* In INPUT section put ": init_buf_pl($var,$arg,$type);" after var name. */
-
-/* Initialize a buffer size argument of type DWORD: */
-#define init_buf_l( svSize ) \
- ( null_arg(svSize) ? 0 : autosize(svSize) ? optUV(svSize) \
- : strtoul( 1+SvPV(svSize,PL_na), NULL, 10 ) )
-/* In INPUT section put "= init_buf_l($arg);" after variable name. */
-
-/* Lengths in WCHARs are initialized the same as lengths in bytes: */
-#define init_buf_plw init_buf_pl
-#define init_buf_lw init_buf_l
-
-/* grow_buf_pl() and grow_buf_plw() are included so you can define
- * parameters of type C<DWORD *>, for example. In practice, it is
- * usually better to define such parameters as "DWORD &". */
-
-/* Grow a buffer where we have a pointer to its size in bytes: */
-#define grow_buf_pl( sBuf,svBuf,tpBuf, plSize,svSize,tpSize ) STMT_START { \
- Debug(("grow_buf_pl( %s==0x%lX,[%s:%ld/%ld, %s==0x%lX:%ld,[%s )\n",\
- string(sBuf),sBuf,strchr(string(svBuf),'('),SvPOK(svBuf)? \
- SvCUR(svBuf):-1,SvPOK(svBuf)?SvLEN(svBuf):-1,string(plSize), \
- plSize,plSize?*plSize:-1,strchr(string(svSize),'('))); \
- if( null_arg(svBuf) ) { \
- sBuf= NULL; \
- } else { \
- STRLEN n_a; \
- if( NULL == plSize ) \
- *( plSize= CAST(tpSize,TempAlloc(sizeof(*plSize))) )= 0;\
- if( ! SvOK(svBuf) ) sv_setpvn(svBuf,"",0); \
- (void) SvPV_force( svBuf, n_a ); \
- sBuf= CAST( tpBuf, lSvGROW( svBuf, *plSize ) ); \
- if( autosize(svSize) ) *plSize= SvLEN(svBuf) - 1; \
- Debug(("more buf_pl( %s==0x%lX,[%s:%ld/%ld, %s==0x%lX:%ld,[%s )\n",\
- string(sBuf),sBuf,strchr(string(svBuf),'('),SvPOK(svBuf)? \
- SvCUR(svBuf):-1,SvPOK(svBuf)?SvLEN(svBuf):-1,string(plSize),\
- plSize,plSize?*plSize:-1,strchr(string(svSize),'('))); \
- } } STMT_END
-
-/* Grow a buffer where we have a pointer to its size in WCHARs: */
-#define grow_buf_plw( sBuf,svBuf, plwSize,svSize,tpSize ) STMT_START { \
- if( null_arg(svBuf) ) { \
- sBuf= NULL; \
- } else { \
- STRLEN n_a; \
- if( NULL == plwSize ) \
- *( plwSize= CAST(tpSize,TempAlloc(sizeof(*plwSize))) )= 0;\
- if( ! SvOK(svBuf) ) sv_setpvn(svBuf,"",0); \
- (void) SvPV_force( svBuf, n_a ); \
- sBuf= lwSvGROW( svBuf, *plwSize ); \
- if( autosize(svSize) ) \
- *plwSize= SvLEN(svBuf)/sizeof(WCHAR) - 1; \
- } } STMT_END
-
-/* Grow a buffer where we have its size in bytes: */
-#define grow_buf_l( sBuf,svBuf,tpBuf, lSize,svSize ) STMT_START { \
- if( null_arg(svBuf) ) { \
- sBuf= NULL; \
- } else { \
- STRLEN n_a; \
- if( ! SvOK(svBuf) ) sv_setpvn(svBuf,"",0); \
- (void) SvPV_force( svBuf, n_a ); \
- sBuf= CAST( tpBuf, lSvGROW( svBuf, lSize ) ); \
- if( autosize(svSize) ) lSize= SvLEN(svBuf) - 1; \
- } } STMT_END
-
-/* Grow a buffer where we have its size in WCHARs: */
-#define grow_buf_lw( swBuf,svBuf, lwSize,svSize ) STMT_START { \
- if( null_arg(svBuf) ) { \
- swBuf= NULL; \
- } else { \
- STRLEN n_a; \
- if( ! SvOK(svBuf) ) sv_setpvn(svBuf,"",0); \
- (void) SvPV_force( svBuf, n_a ); \
- swBuf= lwSvGROW( svBuf, lwSize ); \
- if( autosize(svSize) ) \
- lwSize= SvLEN(svBuf)/sizeof(WCHAR) - 1; \
- } } STMT_END
-
-/* Grow a buffer that contains the declared fixed data type: */
-#define grow_buf( pBuf,svBuf, tpBuf ) STMT_START { \
- if( null_arg(svBuf) ) { \
- pBuf= NULL; \
- } else { \
- STRLEN n_a; \
- if( ! SvOK(svBuf) ) sv_setpvn(svBuf,"",0); \
- (void) SvPV_force( svBuf, n_a ); \
- pBuf= CAST( tpBuf, SvGROW( svBuf, sizeof(*pBuf) ) ); \
- } } STMT_END
-
-/* Grow a buffer that contains a fixed data type other than that declared: */
-#define grow_buf_typ( pBuf,svBuf,tpBuf, Type ) STMT_START { \
- if( null_arg(svBuf) ) { \
- pBuf= NULL; \
- } else { \
- STRLEN n_a; \
- if( ! SvOK(svBuf) ) sv_setpvn(svBuf,"",0); \
- (void) SvPV_force( svBuf, n_a ); \
- pBuf= CAST( tpBuf, SvGROW( svBuf, sizeof(Type) ) ); \
- } } STMT_END
-
-/* Grow a buffer that contains a list of items of the declared data type: */
-#define grow_vect( pBuf,svBuf,tpBuf, cItems ) STMT_START { \
- if( null_arg(svBuf) ) { \
- pBuf= NULL; \
- } else { \
- STRLEN n_a; \
- if( ! SvOK(svBuf) ) sv_setpvn(svBuf,"",0); \
- (void) SvPV_force( svBuf, n_a ); \
- pBuf= CAST( tpBuf, SvGROW( svBuf, sizeof(*pBuf)*cItems ) ); \
- } } STMT_END
-
-/* If call succeeded, set data length to returned length (in bytes): */
-#define trunc_buf_l( bOkay, sBuf,svBuf, lSize ) STMT_START { \
- if( bOkay && NULL != sBuf ) { \
- SvPOK_only( svBuf ); \
- SvCUR_set( svBuf, lSize ); \
- } } STMT_END
-
-/* Same as above except we have a poitner to the returned length: */
-#define trunc_buf_pl( bOkay, sBuf,svBuf, plSize ) \
- trunc_buf_l( bOkay, sBuf,svBuf, *plSize )
-
-/* If call succeeded, set data length to returned length (in WCHARs): */
-#define trunc_buf_lw( bOkay, sBuf,svBuf, lwSize ) STMT_START { \
- if( bOkay && NULL != sBuf ) { \
- SvPOK_only( svBuf ); \
- SvCUR_set( svBuf, (lwSize)*sizeof(WCHAR) ); \
- } } STMT_END
-
-/* Same as above except we have a poitner to the returned length: */
-#define trunc_buf_plw( bOkay, swBuf,svBuf, plwSize ) \
- trunc_buf_lw( bOkay, swBuf,svBuf, *plwSize )
-
-/* Set data length for a buffer that contains the declared fixed data type: */
-#define trunc_buf( bOkay, pBuf,svBuf ) STMT_START { \
- if( bOkay && NULL != pBuf ) { \
- SvPOK_only( svBuf ); \
- SvCUR_set( svBuf, sizeof(*pBuf) ); \
- } } STMT_END
-
-/* Set data length for a buffer that contains some other fixed data type: */
-#define trunc_buf_typ( bOkay, pBuf,svBuf, Type ) STMT_START { \
- if( bOkay && NULL != pBuf ) { \
- SvPOK_only( svBuf ); \
- SvCUR_set( svBuf, sizeof(Type) ); \
- } } STMT_END
-
-/* Set length for buffer that contains list of items of the declared type: */
-#define trunc_vect( bOkay, pBuf,svBuf, cItems ) STMT_START { \
- if( bOkay && NULL != pBuf ) { \
- SvPOK_only( svBuf ); \
- SvCUR_set( svBuf, sizeof(*pBuf)*cItems ); \
- } } STMT_END
-
-/* Set data length for a buffer where a '\0'-terminate string was stored: */
-#define trunc_buf_z( bOkay, sBuf,svBuf ) STMT_START { \
- if( bOkay && NULL != sBuf ) { \
- SvPOK_only( svBuf ); \
- SvCUR_set( svBuf, strlen(sBuf) ); \
- } } STMT_END
-
-/* Set data length for a buffer where a L'\0'-terminate string was stored: */
-#define trunc_buf_zw( bOkay, sBuf,svBuf ) STMT_START { \
- if( bOkay && NULL != sBuf ) { \
- SvPOK_only( svBuf ); \
- SvCUR_set( svBuf, wcslen(sBuf)*sizeof(WCHAR) ); \
- } } STMT_END
diff --git a/win32/ext/Win32API/File/cFile.h b/win32/ext/Win32API/File/cFile.h
deleted file mode 100644
index 23e7ed89f5..0000000000
--- a/win32/ext/Win32API/File/cFile.h
+++ /dev/null
@@ -1 +0,0 @@
-/* Would contain C code to generate Perl constants if not using cFile.pc */
diff --git a/win32/ext/Win32API/File/cFile.pc b/win32/ext/Win32API/File/cFile.pc
deleted file mode 100644
index da00f413aa..0000000000
--- a/win32/ext/Win32API/File/cFile.pc
+++ /dev/null
@@ -1,165 +0,0 @@
-# Generated by cFile_pc.cxx.
-# Package Win32API::File with options:
-# CPLUSPLUS => q[1]
-# IFDEF => q[!/[a-z\d]/]
-# IMPORT_LIST => [q[/._/], q[!/[a-z]/], q[:MEDIA_TYPE]]
-# WRITE_PERL => q[1]
-# Perl files eval'd:
-# File.pm => last if /^\s*(bootstrap|XSLoader::load)\b/
-# C files included:
-# File.xs => last if m#/[/*]\s*CONSTS_DEFINED\b|^\s*MODULE\b#
-sub CREATE_ALWAYS () { 2 }
-sub CREATE_NEW () { 1 }
-sub DDD_EXACT_MATCH_ON_REMOVE () { 4 }
-sub DDD_RAW_TARGET_PATH () { 1 }
-sub DDD_REMOVE_DEFINITION () { 2 }
-sub DRIVE_CDROM () { 5 }
-sub DRIVE_FIXED () { 3 }
-sub DRIVE_NO_ROOT_DIR () { 1 }
-sub DRIVE_RAMDISK () { 6 }
-sub DRIVE_REMOTE () { 4 }
-sub DRIVE_REMOVABLE () { 2 }
-sub DRIVE_UNKNOWN () { 0 }
-sub F3_120M_512 () { 13 }
-sub F3_1Pt44_512 () { 2 }
-sub F3_20Pt8_512 () { 4 }
-sub F3_2Pt88_512 () { 3 }
-sub F3_720_512 () { 5 }
-sub F5_160_512 () { 10 }
-sub F5_180_512 () { 9 }
-sub F5_1Pt2_512 () { 1 }
-sub F5_320_1024 () { 8 }
-sub F5_320_512 () { 7 }
-sub F5_360_512 () { 6 }
-sub FILE_ADD_FILE () { 2 }
-sub FILE_ADD_SUBDIRECTORY () { 4 }
-sub FILE_ALL_ACCESS () { 2032127 }
-sub FILE_APPEND_DATA () { 4 }
-sub FILE_ATTRIBUTE_ARCHIVE () { 32 }
-sub FILE_ATTRIBUTE_COMPRESSED () { 2048 }
-sub FILE_ATTRIBUTE_DEVICE () { 0x00000040 }
-sub FILE_ATTRIBUTE_DIRECTORY () { 0x00000010 }
-sub FILE_ATTRIBUTE_ENCRYPTED () { 0x00004000 }
-sub FILE_ATTRIBUTE_HIDDEN () { 2 }
-sub FILE_ATTRIBUTE_NORMAL () { 128 }
-sub FILE_ATTRIBUTE_NOT_CONTENT_INDEXED () { 0x00002000 }
-sub FILE_ATTRIBUTE_OFFLINE () { 4096 }
-sub FILE_ATTRIBUTE_READONLY () { 1 }
-sub FILE_ATTRIBUTE_REPARSE_POINT () { 0x00000400 }
-sub FILE_ATTRIBUTE_SPARSE_FILE () { 0x00000200 }
-sub FILE_ATTRIBUTE_SYSTEM () { 4 }
-sub FILE_ATTRIBUTE_TEMPORARY () { 256 }
-sub FILE_BEGIN () { 0 }
-sub FILE_CREATE_PIPE_INSTANCE () { 4 }
-sub FILE_CURRENT () { 1 }
-sub FILE_DELETE_CHILD () { 64 }
-sub FILE_END () { 2 }
-sub FILE_EXECUTE () { 32 }
-sub FILE_FLAG_BACKUP_SEMANTICS () { 33554432 }
-sub FILE_FLAG_DELETE_ON_CLOSE () { 67108864 }
-sub FILE_FLAG_NO_BUFFERING () { 536870912 }
-sub FILE_FLAG_OPEN_REPARSE_POINT () { 0x200000 }
-sub FILE_FLAG_OVERLAPPED () { 1073741824 }
-sub FILE_FLAG_POSIX_SEMANTICS () { 16777216 }
-sub FILE_FLAG_RANDOM_ACCESS () { 268435456 }
-sub FILE_FLAG_SEQUENTIAL_SCAN () { 134217728 }
-sub FILE_FLAG_WRITE_THROUGH () { 0x80000000 }
-sub FILE_GENERIC_EXECUTE () { 1179808 }
-sub FILE_GENERIC_READ () { 1179785 }
-sub FILE_GENERIC_WRITE () { 1179926 }
-sub FILE_LIST_DIRECTORY () { 1 }
-sub FILE_READ_ATTRIBUTES () { 128 }
-sub FILE_READ_DATA () { 1 }
-sub FILE_READ_EA () { 8 }
-sub FILE_SHARE_DELETE () { 4 }
-sub FILE_SHARE_READ () { 1 }
-sub FILE_SHARE_WRITE () { 2 }
-sub FILE_TRAVERSE () { 32 }
-sub FILE_TYPE_CHAR () { 2 }
-sub FILE_TYPE_DISK () { 1 }
-sub FILE_TYPE_PIPE () { 3 }
-sub FILE_TYPE_UNKNOWN () { 0 }
-sub FILE_WRITE_ATTRIBUTES () { 256 }
-sub FILE_WRITE_DATA () { 2 }
-sub FILE_WRITE_EA () { 16 }
-sub FS_CASE_IS_PRESERVED () { 2 }
-sub FS_CASE_SENSITIVE () { 1 }
-sub FS_FILE_COMPRESSION () { 16 }
-sub FS_PERSISTENT_ACLS () { 8 }
-sub FS_UNICODE_STORED_ON_DISK () { 4 }
-sub FS_VOL_IS_COMPRESSED () { 32768 }
-sub FSCTL_SET_REPARSE_POINT () { (9 << 16 | 0 << 14 | 41 << 2 | 0) }
-sub FSCTL_GET_REPARSE_POINT () { (9 << 16 | 0 << 14 | 42 << 2 | 0) }
-sub FSCTL_DELETE_REPARSE_POINT () { (9 << 16 | 0 << 14 | 43 << 2 | 0) }
-sub FixedMedia () { 12 }
-sub GENERIC_ALL () { 268435456 }
-sub GENERIC_EXECUTE () { 536870912 }
-sub GENERIC_READ () { 0x80000000 }
-sub GENERIC_WRITE () { 1073741824 }
-sub HANDLE_FLAG_INHERIT () { 1 }
-sub HANDLE_FLAG_PROTECT_FROM_CLOSE () { 2 }
-sub INVALID_FILE_ATTRIBUTES () { 0xFFFFFFFF }
-sub INVALID_HANDLE_VALUE () { 0xffffffff }
-sub IOCTL_DISK_FORMAT_TRACKS () { 507928 }
-sub IOCTL_DISK_FORMAT_TRACKS_EX () { 507948 }
-sub IOCTL_DISK_GET_DRIVE_GEOMETRY () { 458752 }
-sub IOCTL_DISK_GET_DRIVE_LAYOUT () { 475148 }
-sub IOCTL_DISK_GET_MEDIA_TYPES () { 461824 }
-sub IOCTL_DISK_GET_PARTITION_INFO () { 475140 }
-sub IOCTL_DISK_HISTOGRAM_DATA () { 458804 }
-sub IOCTL_DISK_HISTOGRAM_RESET () { 458808 }
-sub IOCTL_DISK_HISTOGRAM_STRUCTURE () { 458800 }
-sub IOCTL_DISK_IS_WRITABLE () { 458788 }
-sub IOCTL_DISK_LOGGING () { 458792 }
-sub IOCTL_DISK_PERFORMANCE () { 458784 }
-sub IOCTL_DISK_REASSIGN_BLOCKS () { 507932 }
-sub IOCTL_DISK_REQUEST_DATA () { 458816 }
-sub IOCTL_DISK_REQUEST_STRUCTURE () { 458812 }
-sub IOCTL_DISK_SET_DRIVE_LAYOUT () { 507920 }
-sub IOCTL_DISK_SET_PARTITION_INFO () { 507912 }
-sub IOCTL_DISK_VERIFY () { 458772 }
-sub IOCTL_STORAGE_CHECK_VERIFY () { 2967552 }
-sub IOCTL_STORAGE_EJECT_MEDIA () { 2967560 }
-sub IOCTL_STORAGE_FIND_NEW_DEVICES () { 2967576 }
-sub IOCTL_STORAGE_GET_MEDIA_TYPES () { 2952192 }
-sub IOCTL_STORAGE_LOAD_MEDIA () { 2967564 }
-sub IOCTL_STORAGE_MEDIA_REMOVAL () { 2967556 }
-sub IOCTL_STORAGE_RELEASE () { 2967572 }
-sub IOCTL_STORAGE_RESERVE () { 2967568 }
-sub MOVEFILE_COPY_ALLOWED () { 2 }
-sub MOVEFILE_DELAY_UNTIL_REBOOT () { 4 }
-sub MOVEFILE_REPLACE_EXISTING () { 1 }
-sub MOVEFILE_WRITE_THROUGH () { 8 }
-sub OPEN_ALWAYS () { 4 }
-sub OPEN_EXISTING () { 3 }
-sub PARTITION_ENTRY_UNUSED () { 0 }
-sub PARTITION_EXTENDED () { 5 }
-sub PARTITION_FAT32 () { 11 }
-sub PARTITION_FAT32_XINT13 () { 12 }
-sub PARTITION_FAT_12 () { 1 }
-sub PARTITION_FAT_16 () { 4 }
-sub PARTITION_HUGE () { 6 }
-sub PARTITION_IFS () { 7 }
-sub PARTITION_NTFT () { 128 }
-sub PARTITION_PREP () { 65 }
-sub PARTITION_UNIX () { 99 }
-sub PARTITION_XENIX_1 () { 2 }
-sub PARTITION_XENIX_2 () { 3 }
-sub PARTITION_XINT13 () { 14 }
-sub PARTITION_XINT13_EXTENDED () { 15 }
-sub RemovableMedia () { 11 }
-sub SECURITY_ANONYMOUS () { 0 }
-sub SECURITY_CONTEXT_TRACKING () { 262144 }
-sub SECURITY_DELEGATION () { 196608 }
-sub SECURITY_EFFECTIVE_ONLY () { 524288 }
-sub SECURITY_IDENTIFICATION () { 65536 }
-sub SECURITY_IMPERSONATION () { 131072 }
-sub SECURITY_SQOS_PRESENT () { 1048576 }
-sub SEM_FAILCRITICALERRORS () { 1 }
-sub SEM_NOALIGNMENTFAULTEXCEPT () { 4 }
-sub SEM_NOGPFAULTERRORBOX () { 2 }
-sub SEM_NOOPENFILEERRORBOX () { 32768 }
-sub TRUNCATE_EXISTING () { 5 }
-sub Unknown () { 0 }
-sub VALID_NTFT () { 192 }
-1;
diff --git a/win32/ext/Win32API/File/const2perl.h b/win32/ext/Win32API/File/const2perl.h
deleted file mode 100644
index dbd94c10a8..0000000000
--- a/win32/ext/Win32API/File/const2perl.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/* const2perl.h -- For converting C constants into Perl constant subs
- * (usually via XS code but can just write Perl code to stdout). */
-
-
-/* #ifndef _INCLUDE_CONST2PERL_H
- * #define _INCLUDE_CONST2PERL_H 1 */
-
-#ifndef CONST2WRITE_PERL /* Default is "const to .xs": */
-
-# define newconst( sName, sFmt, xValue, newSV ) \
- newCONSTSUB( mHvStash, sName, newSV )
-
-# define noconst( const ) av_push( mAvExportFail, newSVpv(#const,0) )
-
-# define setuv(u) do { \
- mpSvNew= newSViv(0); sv_setuv(mpSvNew,u); \
- } while( 0 )
-
-#else
-
-/* #ifdef __cplusplus
- * # undef printf
- * # undef fprintf
- * # undef stderr
- * # define stderr (&_iob[2])
- * # undef iobuf
- * # undef malloc
- * #endif */
-
-# include <stdio.h> /* Probably already included, but shouldn't hurt */
-# include <errno.h> /* Possibly already included, but shouldn't hurt */
-
-# define newconst( sName, sFmt, xValue, newSV ) \
- printf( "sub %s () { " sFmt " }\n", sName, xValue )
-
-# define noconst( const ) printf( "push @EXPORT_FAIL, '%s';\n", #const )
-
-# define setuv(u) /* Nothing */
-
-# ifndef IVdf
-# define IVdf "ld"
-# endif
-# ifndef UVuf
-# define UVuf "lu"
-# endif
-# ifndef UVxf
-# define UVxf "lX"
-# endif
-# ifndef NV_DIG
-# define NV_DIG 15
-# endif
-
-static char *
-escquote( const char *sValue )
-{
- Size_t lLen= 1+2*strlen(sValue);
- char *sEscaped= (char *) malloc( lLen );
- char *sNext= sEscaped;
- if( NULL == sEscaped ) {
- fprintf( stderr, "Can't allocate %"UVuf"-byte buffer (errno=%d)\n",
- U_V(lLen), _errno );
- exit( 1 );
- }
- while( '\0' != *sValue ) {
- switch( *sValue ) {
- case '\'':
- case '\\':
- *(sNext++)= '\\';
- }
- *(sNext++)= *(sValue++);
- }
- *sNext= *sValue;
- return( sEscaped );
-}
-
-#endif
-
-
-#ifdef __cplusplus
-
-class _const2perl {
- public:
- char msBuf[64]; /* Must fit sprintf of longest NV */
-#ifndef CONST2WRITE_PERL
- HV *mHvStash;
- AV *mAvExportFail;
- SV *mpSvNew;
- _const2perl::_const2perl( char *sModName ) {
- mHvStash= gv_stashpv( sModName, TRUE );
- SV **pSv= hv_fetch( mHvStash, "EXPORT_FAIL", 11, TRUE );
- GV *gv;
- char *sVarName= (char *) malloc( 15+strlen(sModName) );
- strcpy( sVarName, sModName );
- strcat( sVarName, "::EXPORT_FAIL" );
- gv= gv_fetchpv( sVarName, 1, SVt_PVAV );
- mAvExportFail= GvAVn( gv );
- }
-#else
- _const2perl::_const2perl( char *sModName ) {
- ; /* Nothing to do */
- }
-#endif /* CONST2WRITE_PERL */
- void mkconst( char *sName, unsigned long uValue ) {
- setuv(uValue);
- newconst( sName, "0x%"UVxf, uValue, mpSvNew );
- }
- void mkconst( char *sName, unsigned int uValue ) {
- setuv(uValue);
- newconst( sName, "0x%"UVxf, uValue, mpSvNew );
- }
- void mkconst( char *sName, unsigned short uValue ) {
- setuv(uValue);
- newconst( sName, "0x%"UVxf, uValue, mpSvNew );
- }
- void mkconst( char *sName, long iValue ) {
- newconst( sName, "%"IVdf, iValue, newSViv(iValue) );
- }
- void mkconst( char *sName, int iValue ) {
- newconst( sName, "%"IVdf, iValue, newSViv(iValue) );
- }
- void mkconst( char *sName, short iValue ) {
- newconst( sName, "%"IVdf, iValue, newSViv(iValue) );
- }
- void mkconst( char *sName, double nValue ) {
- newconst( sName, "%s",
- Gconvert(nValue,NV_DIG,0,msBuf), newSVnv(nValue) );
- }
- void mkconst( char *sName, char *sValue ) {
- newconst( sName, "'%s'", escquote(sValue), newSVpv(sValue,0) );
- }
- void mkconst( char *sName, const void *pValue ) {
- setuv((UV)pValue);
- newconst( sName, "0x%"UVxf, (UV)(pValue), mpSvNew );
- }
-/*#ifdef HAS_QUAD
- * HAS_QUAD only means pack/unpack deal with them, not that SVs can.
- * void mkconst( char *sName, Quad_t *qValue ) {
- * newconst( sName, "0x%"QVxf, qValue, newSVqv(qValue) );
- * }
- *#endif / * HAS_QUAD */
-};
-
-#define START_CONSTS( sModName ) _const2perl const2( sModName );
-#define const2perl( const ) const2.mkconst( #const, const )
-
-#else /* __cplusplus */
-
-# ifndef CONST2WRITE_PERL
-# define START_CONSTS( sModName ) \
- HV *mHvStash= gv_stashpv( sModName, TRUE ); \
- AV *mAvExportFail; \
- SV *mpSvNew; \
- { char *sVarName= malloc( 15+strlen(sModName) ); \
- GV *gv; \
- strcpy( sVarName, sModName ); \
- strcat( sVarName, "::EXPORT_FAIL" ); \
- gv= gv_fetchpv( sVarName, 1, SVt_PVAV ); \
- mAvExportFail= GvAVn( gv ); \
- }
-# else
-# define START_CONSTS( sModName ) /* Nothing */
-# endif
-
-#define const2perl( const ) do { \
- if( const < 0 ) { \
- newconst( #const, "%"IVdf, const, newSViv((IV)const) ); \
- } else { \
- setuv( (UV)const ); \
- newconst( #const, "0x%"UVxf, const, mpSvNew ); \
- } \
- } while( 0 )
-
-#endif /* __cplusplus */
-
-
-//Example use:
-//#include <const2perl.h>
-// {
-// START_CONSTS( "Package::Name" ) /* No ";" */
-//#ifdef $const
-// const2perl( $const );
-//#else
-// noconst( $const );
-//#endif
-// }
-// sub ? { my( $sConstName )= @_;
-// return $sConstName; # "#ifdef $sConstName"
-// return FALSE; # Same as above
-// return "HAS_QUAD"; # "#ifdef HAS_QUAD"
-// return "#if 5.04 <= VERSION";
-// return "#if 0";
-// return 1; # No #ifdef
-/* #endif / * _INCLUDE_CONST2PERL_H */
diff --git a/win32/ext/Win32API/File/t/file.t b/win32/ext/Win32API/File/t/file.t
deleted file mode 100644
index f7f16c5744..0000000000
--- a/win32/ext/Win32API/File/t/file.t
+++ /dev/null
@@ -1,408 +0,0 @@
-#!/usr/bin/perl -w
-# Before `make install' is performed this script should be runnable with
-# `make test'. After `make install' it should work as `perl test.pl'
-
-######################### We start with some black magic to print on failure.
-
-BEGIN { $|= 1; print "1..267\n"; }
-END {print "not ok 1\n" unless $loaded;}
-
-# Win32API::File does an implicit "require Win32", but
-# the ../lib directory in @INC will no longer work once
-# we chdir() into the TEMP directory.
-use Win32;
-
-use Win32API::File qw(:ALL);
-$loaded = 1;
-print "ok 1\n";
-
-######################### End of black magic.
-
-$test= 1;
-
-use strict qw(subs);
-
-$temp= $ENV{"TMP"};
-$temp= $ENV{"TEMP"} unless -d $temp;
-$temp= "C:/Temp" unless -d $temp;
-$temp= "." unless -d $temp;
-$dir= "W32ApiF.tmp";
-
-$ENV{WINDIR} = $ENV{SYSTEMROOT} if not exists $ENV{WINDIR};
-
-chdir( $temp )
- or die "# Can't cd to temp directory, $temp: $!\n";
-
-if( -d $dir ) {
- print "# deleting $temp\\$dir\\*\n" if glob "$dir/*";
-
- for (glob "$dir/*") {
- chmod 0777, $_;
- unlink $_;
- }
- rmdir $dir or die "Could not rmdir $dir: $!";
-}
-mkdir( $dir, 0777 )
- or die "# Can't create temp dir, $temp/$dir: $!\n";
-print "# chdir $temp\\$dir\n";
-chdir( $dir )
- or die "# Can't cd to my dir, $temp/$dir: $!\n";
-
-$h1= createFile( "ReadOnly.txt", "r", { Attributes=>"r" } );
-$ok= ! $h1 && fileLastError() =~ /not find the file?/i;
-$ok or print "# ","".fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 2
-if( ! $ok ) { CloseHandle($h1); unlink("ReadOnly.txt"); }
-
-$ok= $h1= createFile( "ReadOnly.txt", "wcn", { Attributes=>"r" } );
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 3
-
-$ok= WriteFile( $h1, "Original text\n", 0, [], [] );
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 4
-
-$h2= createFile( "ReadOnly.txt", "rcn" );
-$ok= ! $h2 && fileLastError() =~ /file exists?/i;
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 5
-if( ! $ok ) { CloseHandle($h2); }
-
-$h2= createFile( "ReadOnly.txt", "rwke" );
-$ok= ! $h2 && fileLastError() =~ /access is denied?/i;
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 6
-if( ! $ok ) { CloseHandle($h2); }
-
-$ok= $h2= createFile( "ReadOnly.txt", "r" );
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 7
-
-$ok= SetFilePointer( $h1, length("Original"), [], FILE_BEGIN );
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 8
-
-$ok= WriteFile( $h1, "ly was other text\n", 0, $len, [] )
- && $len == length("ly was other text\n");
-$ok or print "# <$len> should be <",
- length("ly was other text\n"),">: ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 9
-
-$ok= ReadFile( $h2, $text, 80, $len, [] )
- && $len == length($text);
-$ok or print "# <$len> should be <",length($text),
- ">: ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 10
-
-$ok= $text eq "Originally was other text\n";
-if( !$ok ) {
- $text =~ s/\r/\\r/g; $text =~ s/\n/\\n/g;
- print "# <$text> should be <Originally was other text\\n>.\n";
-}
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 11
-
-$ok= CloseHandle($h2);
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 12
-
-$ok= ! ReadFile( $h2, $text, 80, $len, [] )
- && fileLastError() =~ /handle is invalid?/i;
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 13
-
-CloseHandle($h1);
-
-$ok= $h1= createFile( "CanWrite.txt", "rw", FILE_SHARE_WRITE,
- { Create=>CREATE_ALWAYS } );
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 14
-
-$ok= WriteFile( $h1, "Just this and not this", 10, [], [] );
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 15
-
-$ok= $h2= createFile( "CanWrite.txt", "wk", { Share=>"rw" } );
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 16
-
-$ok= OsFHandleOpen( "APP", $h2, "wat" );
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 17
-
-$ok= $h2 == GetOsFHandle( "APP" );
-$ok or print "# $h2 != ",GetOsFHandle("APP"),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 18
-
-{ my $save= select(APP); $|= 1; select($save); }
-$ok= print APP "is enough\n";
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 19
-
-SetFilePointer($h1, 0, [], FILE_BEGIN) if $^O eq 'cygwin';
-
-$ok= ReadFile( $h1, $text, 0, [], [] );
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 20
-
-$ok= $text eq "is enough\r\n";
-if( !$ok ) {
- $text =~ s/\r/\\r/g;
- $text =~ s/\n/\\n/g;
- print "# <$text> should be <is enough\\r\\n>\n";
-}
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 21
-
-$skip = "";
-if ($^O eq 'cygwin') {
- $ok = 1;
- $skip = " # skip cygwin can delete open files";
-}
-else {
- unlink("CanWrite.txt");
- $ok= -e "CanWrite.txt" && $! =~ /permission denied/i;
- $ok or print "# $!\n";
-}
-print $ok ? "" : "not ", "ok ", ++$test, "$skip\n"; # ok 22
-
-close(APP); # Also does C<CloseHandle($h2)>
-## CloseHandle( $h2 );
-CloseHandle( $h1 );
-
-$ok= ! DeleteFile( "ReadOnly.txt" )
- && fileLastError() =~ /access is denied?/i;
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 23
-
-$ok= ! CopyFile( "ReadOnly.txt", "CanWrite.txt", 1 )
- && fileLastError() =~ /file exists?/i;
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 24
-
-$ok= ! CopyFile( "CanWrite.txt", "ReadOnly.txt", 0 )
- && fileLastError() =~ /access is denied?/i;
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 25
-
-$ok= ! MoveFile( "NoSuchFile", "NoSuchDest" )
- && fileLastError() =~ /not find the file/i;
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 26
-
-$ok= ! MoveFileEx( "NoSuchFile", "NoSuchDest", 0 )
- && fileLastError() =~ /not find the file/i;
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 27
-
-$ok= ! MoveFile( "ReadOnly.txt", "CanWrite.txt" )
- && fileLastError() =~ /file already exists?/i;
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 28
-
-$ok= ! MoveFileEx( "ReadOnly.txt", "CanWrite.txt", 0 )
- && fileLastError() =~ /file already exists?/i;
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 29
-
-$ok= CopyFile( "ReadOnly.txt", "ReadOnly.cp", 1 )
- && CopyFile( "CanWrite.txt", "CanWrite.cp", 1 );
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 30
-
-$ok= ! MoveFileEx( "CanWrite.txt", "ReadOnly.cp", MOVEFILE_REPLACE_EXISTING )
- && fileLastError() =~ /access is denied?|cannot create/i;
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 31
-
-$ok= MoveFileEx( "ReadOnly.cp", "CanWrite.cp", MOVEFILE_REPLACE_EXISTING );
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 32
-
-$ok= MoveFile( "CanWrite.cp", "Moved.cp" );
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 33
-
-$ok= ! unlink( "ReadOnly.cp" )
- && $! =~ /no such file/i
- && ! unlink( "CanWrite.cp" )
- && $! =~ /no such file/i;
-$ok or print "# $!\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 34
-
-$ok= ! DeleteFile( "Moved.cp" )
- && fileLastError() =~ /access is denied?/i;
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 35
-
-system( "attrib -r Moved.cp" );
-
-$ok= DeleteFile( "Moved.cp" );
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 36
-
-$new= SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX;
-$old= SetErrorMode( $new );
-$renew= SetErrorMode( $old );
-$reold= SetErrorMode( $old );
-
-$ok= $old == $reold;
-$ok or print "# $old != $reold: ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 37
-
-$ok= ($renew&$new) == $new;
-$ok or print "# $new != $renew: ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 38
-
-$ok= @drives= getLogicalDrives();
-$ok && print "# @drives\n";
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 39
-
-$ok= $drives[0] !~ /^[ab]/ || DRIVE_REMOVABLE == GetDriveType($drives[0]);
-$ok or print "# ",DRIVE_REMOVABLE," != ",GetDriveType($drives[0]),
- ": ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 40
-
-$drive= substr( $ENV{WINDIR}, 0, 3 );
-
-$ok= 1 == grep /^\Q$drive\E/i, @drives;
-$ok or print "# No $drive found in list of drives.\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 41
-
-$ok= DRIVE_FIXED == GetDriveType( $drive );
-$ok or print
- "# ",DRIVE_FIXED," != ",GetDriveType($drive),": ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 42
-
-$ok= GetVolumeInformation( $drive, $vol, 64, $ser, $max, $flag, $fs, 16 );
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 43
-$vol= $ser= $max= $flag= $fs= ""; # Prevent warnings.
-
-chop($drive);
-$ok= QueryDosDevice( $drive, $dev, 80 );
-$ok or print "# $drive: ",fileLastError(),"\n";
-if( $ok ) {
- ( $text= $dev ) =~ s/\0/\\0/g;
- print "# $drive => $text\n";
-}
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 44
-
-$bits= GetLogicalDrives();
-$let= 25;
-$bit= 1<<$let;
-while( $bit & $bits ) {
- $let--;
- $bit >>= 1;
-}
-$let= pack( "C", $let + unpack("C","A") ) . ":";
-print "# Querying undefined $let.\n";
-
-$ok= DefineDosDevice( 0, $let, $ENV{WINDIR} );
-$ok or print "# $let,$ENV{WINDIR}: ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 45
-
-$ok= -s $let."/Win.ini" == -s $ENV{WINDIR}."/Win.ini";
-$ok or print "# ", -s $let."/Win.ini", " vs. ",
- -s $ENV{WINDIR}."/Win.ini", ": ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 46
-
-$ok= DefineDosDevice( DDD_REMOVE_DEFINITION|DDD_EXACT_MATCH_ON_REMOVE,
- $let, $ENV{WINDIR} );
-$ok or print "# $let,$ENV{WINDIR}: ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 47
-
-$ok= ! -f $let."/Win.ini"
- && $! =~ /no such file/i;
-$ok or print "# $!\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 48
-
-$ok= DefineDosDevice( DDD_RAW_TARGET_PATH, $let, $dev );
-if( !$ok ) {
- ( $text= $dev ) =~ s/\0/\\0/g;
- print "# $let,$text: ",fileLastError(),"\n";
-}
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 49
-
-$ok= -f $let.substr($ENV{WINDIR},3)."/win.ini";
-$ok or print "# ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 50
-
-$ok= DefineDosDevice( DDD_REMOVE_DEFINITION|DDD_EXACT_MATCH_ON_REMOVE
- |DDD_RAW_TARGET_PATH, $let, $dev );
-$ok or print "# $let,$dev: ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 51
-
-my $path = $ENV{WINDIR};
-my $attrs = GetFileAttributes( $path );
-$ok= $attrs != INVALID_FILE_ATTRIBUTES;
-$ok or print "# $path gave invalid attribute value, attrs=$attrs: ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 52
-
-$ok= ($attrs & FILE_ATTRIBUTE_DIRECTORY);
-$ok or print "# $path not a directory, attrs=$attrs: ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 53
-
-$path .= "/win.ini";
-$attrs = GetFileAttributes( $path );
-$ok= $attrs != INVALID_FILE_ATTRIBUTES;
-$ok or print "# $path gave invalid attribute value, attrs=$attrs: ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 54
-
-$ok= !($attrs & FILE_ATTRIBUTE_DIRECTORY);
-$ok or print "# $path is a directory, attrs=$attrs: ",fileLastError(),"\n";
-print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 55
-
-# DefineDosDevice
-# GetFileType
-# GetVolumeInformation
-# QueryDosDevice
-#Add a drive letter that points to our temp directory
-#Add a drive letter that points to the drive our directory is in
-
-#winnt.t:
-# get first drive letters and use to test disk and storage IOCTLs
-# "//./PhysicalDrive0"
-# DeviceIoControl
-
-my %consts;
-my @consts= @Win32API::File::EXPORT_OK;
-@consts{@consts}= @consts;
-
-my( @noargs, %noargs )= qw(
- attrLetsToBits fileLastError getLogicalDrives GetLogicalDrives );
-@noargs{@noargs}= @noargs;
-
-foreach $func ( @{$Win32API::File::EXPORT_TAGS{Func}} ) {
- delete $consts{$func};
- if( defined( $noargs{$func} ) ) {
- $ok= ! eval("$func(0,0)") && $@ =~ /(::|\s)_?${func}A?[(:\s]/;
- } else {
- $ok= ! eval("$func()") && $@ =~ /(::|\s)_?${func}A?[(:\s]/;
- }
- $ok or print "# $func: $@\n";
- print $ok ? "" : "not ", "ok ", ++$test, "\n";
-}
-
-foreach $func ( @{$Win32API::File::EXPORT_TAGS{FuncA}},
- @{$Win32API::File::EXPORT_TAGS{FuncW}} ) {
- $ok= ! eval("$func()") && $@ =~ /::_?${func}\(/;
- delete $consts{$func};
- $ok or print "# $func: $@\n";
- print $ok ? "" : "not ", "ok ", ++$test, "\n";
-}
-
-foreach $const ( keys(%consts) ) {
- $ok= eval("my \$x= $const(); 1");
- $ok or print "# Constant $const: $@\n";
- print $ok ? "" : "not ", "ok ", ++$test, "\n";
-}
-
-chdir( $temp );
-if (-e "$dir/ReadOnly.txt") {
- chmod 0777, "$dir/ReadOnly.txt";
- unlink "$dir/ReadOnly.txt";
-}
-unlink "$dir/CanWrite.txt" if -e "$dir/CanWrite.txt";
-rmdir $dir;
-
-__END__
diff --git a/win32/ext/Win32API/File/t/tie.t b/win32/ext/Win32API/File/t/tie.t
deleted file mode 100644
index ec2f7c2cf9..0000000000
--- a/win32/ext/Win32API/File/t/tie.t
+++ /dev/null
@@ -1,79 +0,0 @@
-#!perl
-# vim:syntax=perl:
-
-BEGIN { $|= 1; print "1..10\n"; }
-END { print "not ok 1\n" unless $main::loaded; }
-
-use strict;
-use warnings;
-use Win32API::File qw(:ALL);
-use IO::File;
-
-$main::loaded = 1;
-
-print "ok 1\n";
-
-unlink "foo.txt";
-
-my $fh = new Win32API::File "+> foo.txt"
- or die fileLastError();
-
-my $tell = tell $fh;
-print "# tell \$fh == '$tell'\n";
-print "not " unless
- tell $fh == 0;
-print "ok 2\n";
-
-my $text = "some text\n";
-
-print "not " unless
- print $fh $text;
-print "ok 3\n";
-
-$tell = tell $fh;
-print "# after printing 'some text\\n', tell is: '$tell'\n";
-print "not " unless
- $tell == length($text) + 1;
-print "ok 4\n";
-
-print "not " unless
- seek($fh, 0, 0) == 0;
-print "ok 5\n";
-
-print "not " unless
- not eof $fh;
-print "ok 6\n";
-
-my $readline = <$fh>;
-
-my $pretty_readline = $readline;
-$pretty_readline =~ s/\r/\\r/g; $pretty_readline =~ s/\n/\\n/g;
-print "# read line is '$pretty_readline'\n";
-
-print "not " unless
- $readline eq "some text\r\n";
-print "ok 7\n";
-
-print "not " unless
- eof $fh;
-print "ok 8\n";
-
-print "not " unless
- close $fh;
-print "ok 9\n";
-
-# Test out binmode (should be only LF with print, no CR).
-
-$fh = new Win32API::File "+> foo.txt"
- or die fileLastError();
-binmode $fh;
-print $fh "hello there\n";
-seek $fh, 0, 0;
-
-print "not " unless
- <$fh> eq "hello there\n";
-print "ok 10\n";
-
-close $fh;
-
-unlink "foo.txt";
diff --git a/win32/ext/Win32API/File/typemap b/win32/ext/Win32API/File/typemap
deleted file mode 100644
index d5957652f9..0000000000
--- a/win32/ext/Win32API/File/typemap
+++ /dev/null
@@ -1,140 +0,0 @@
-BOOL T_BOOL
-LONG T_IV
-HKEY T_UV
-HANDLE T_UV
-DWORD T_UV
-oDWORD O_UV
-UINT T_UV
-REGSAM T_UV
-SECURITY_INFORMATION T_UV
-char * T_BUF
-WCHAR * T_BUF
-BYTE * T_BUF
-void * T_BUF
-ValEntA * T_BUF
-ValEntW * T_BUF
-SECURITY_DESCRIPTOR * T_BUF
-SECURITY_ATTRIBUTES * T_BUF
-LPOVERLAPPED T_BUF
-LONG * T_IVBUF
-DWORD * T_UVBUF
-LPDWORD T_UVBUF
-oDWORD * O_UVBUF
-HKEY * T_UVBUFP
-oHKEY * O_UVBUFP
-FILETIME * T_SBUF
-
-#############################################################################
-INPUT
-T_BOOL
- $var= null_arg($arg)||!SvTRUE($arg) ? ($type)0 : looks_like_number($arg) ? ($type)SvIV($arg) : ($type)1
-T_BUF
- if( null_arg($arg) )
- $var= NULL;
- else
- $var= ($type) SvPV( $arg, PL_na )
-T_SBUF
- grow_buf( $var,$arg, $type )
-T_IV
- $var= null_arg($arg) ? ($type)0 : INT2PTR($type,SvIV($arg))
-T_UV
- $var= null_arg($arg) ? ($type)0 : INT2PTR($type,SvUV($arg))
-O_IV
- $var= optIV($arg)
-O_UV
- $var= optUV($arg)
-T_IVBUF
- if( null_arg($arg) )
- $var= NULL;
- else
- *( $var= ($type) TempAlloc( sizeof(*($var)) ) )= SvIV($arg)
-T_UVBUF
- if( null_arg($arg) )
- $var= NULL;
- else
- *( $var= ($type) TempAlloc( sizeof(*($var)) ) )= SvUV($arg)
-O_IVBUF
- if( null_arg($arg) )
- $var= NULL;
- else
- *( $var= ($type) TempAlloc( sizeof(*($var)) ) )=
- SvOK($arg) ? SvIV($arg) : 0;
-O_UVBUF
- if( null_arg($arg) )
- $var= NULL;
- else
- *( $var= ($type) TempAlloc( sizeof(*($var)) ) )=
- SvOK($arg) ? SvUV($arg) : 0;
-T_IVBUFP
- if( null_arg($arg) )
- $var= NULL;
- else
- *( $var= ($type) TempAlloc( sizeof(*($var)) ) )= (void *)SvIV($arg)
-T_UVBUFP
- if( null_arg($arg) )
- $var= NULL;
- else
- *( $var= ($type) TempAlloc( sizeof(*($var)) ) )= (void *)SvUV($arg)
-O_IVBUFP
- if( null_arg($arg) )
- $var= NULL;
- else
- *( $var= ($type) TempAlloc( sizeof(*($var)) ) )=
- SvOK($arg) ? (void *)SvIV($arg) : 0;
-O_UVBUFP
- if( null_arg($arg) )
- $var= NULL;
- else
- *( $var= ($type) TempAlloc( sizeof(*($var)) ) )=
- SvOK($arg) ? (void *)SvUV($arg) : 0;
-
-#############################################################################
-OUTPUT
-T_BOOL
- if( ! null_arg($arg) && ! SvREADONLY($arg) ) {
- if( $var ) {
- sv_setiv( $arg, (IV)$var );
- } else {
- sv_setsv( $arg, &PL_sv_no );
- }
- }
-T_BUF
- ;
-T_SBUF
- trunc_buf( RETVAL, $var,$arg );
-T_IV
- if( ! null_arg($arg) && ! SvREADONLY($arg) )
- sv_setiv( $arg, PTR2IV($var) );
-T_UV
- if( ! null_arg($arg) && ! SvREADONLY($arg) )
- sv_setuv( $arg, PTR2UV($var) );
-O_IV
- if( ! null_arg($arg) )
- sv_setiv( $arg, PTR2IV($var) );
-O_UV
- if( ! null_arg($arg) )
- sv_setuv( $arg, PTR2UV($var) );
-T_IVBUF
- if( ! null_arg($arg) && ! SvREADONLY($arg) )
- sv_setiv( $arg, (IV)*($var) );
-T_UVBUF
- if( ! null_arg($arg) && ! SvREADONLY($arg) )
- sv_setuv( $arg, (UV)*($var) );
-O_IVBUF
- if( ! null_arg($arg) )
- sv_setiv( $arg, (IV)*($var) );
-O_UVBUF
- if( ! null_arg($arg) )
- sv_setuv( $arg, (UV)*($var) );
-T_IVBUFP
- if( ! null_arg($arg) && ! SvREADONLY($arg) )
- sv_setiv( $arg, (IV)*($var) );
-T_UVBUFP
- if( ! null_arg($arg) && ! SvREADONLY($arg) )
- sv_setuv( $arg, (UV)*($var) );
-O_IVBUFP
- if( ! null_arg($arg) )
- sv_setiv( $arg, (IV)*($var) );
-O_UVBUFP
- if( ! null_arg($arg) )
- sv_setuv( $arg, (UV)*($var) );
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 7b6a1d35c9..aba1945e11 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -938,7 +938,7 @@ SETARGV_OBJ = setargv$(o)
# specify static extensions here
#STATIC_EXT = Cwd Compress/Raw/Zlib
-STATIC_EXT =
+STATIC_EXT = Win32CORE
DYNALOADER = $(EXTDIR)\DynaLoader\DynaLoader
@@ -1336,26 +1336,26 @@ MakePPPort_clean:
Extensions : buildext.pl $(PERLDEP) $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
$(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) $(EXTDIR) --dynamic
- $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext --dynamic
+ -if exist ext $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext --dynamic
Extensions_reonly : buildext.pl $(PERLDEP) $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
$(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) $(EXTDIR) --dynamic +re
- $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext --dynamic +re
+ -if exist ext $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext --dynamic +re
Extensions_static : buildext.pl $(PERLDEP) $(CONFIGPM)
$(XCOPY) ..\*.h $(COREDIR)\*.*
$(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) $(EXTDIR) --static
- $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext --static
+ -if exist ext $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext --static
$(MINIPERL) -I..\lib buildext.pl --list-static-libs > Extensions_static
Extensions_clean :
-if exist $(MINIPERL) $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) $(EXTDIR) clean
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext clean
+ -if exist $(MINIPERL) if exist ext $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext clean
Extensions_realclean :
-if exist $(MINIPERL) $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) $(EXTDIR) realclean
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext realclean
+ -if exist $(MINIPERL) if exist ext $(MINIPERL) -I..\lib buildext.pl $(MAKE) $(PERLDEP) ext realclean
#-------------------------------------------------------------------------------
diff --git a/win32/win32.c b/win32/win32.c
index cbd3a36399..aacc656da8 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -4561,73 +4561,21 @@ XS(w32_SetChildShowWindow)
XSRETURN(1);
}
-static void
-forward(pTHX_ const char *function)
-{
- dXSARGS;
- Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, newSVpvn("Win32",5), newSVnv(0.27));
- SPAGAIN;
- PUSHMARK(SP-items);
- call_pv(function, GIMME_V);
-}
-
-#define FORWARD(function) XS(w32_##function){ forward(aTHX_ "Win32::"#function); }
-FORWARD(GetCwd)
-FORWARD(SetCwd)
-FORWARD(GetNextAvailDrive)
-FORWARD(GetLastError)
-FORWARD(SetLastError)
-FORWARD(LoginName)
-FORWARD(NodeName)
-FORWARD(DomainName)
-FORWARD(FsType)
-FORWARD(GetOSVersion)
-FORWARD(IsWinNT)
-FORWARD(IsWin95)
-FORWARD(FormatMessage)
-FORWARD(Spawn)
-FORWARD(GetTickCount)
-FORWARD(GetShortPathName)
-FORWARD(GetFullPathName)
-FORWARD(GetLongPathName)
-FORWARD(CopyFile)
-FORWARD(Sleep)
-
-/* Don't forward Win32::SetChildShowWindow(). It accesses the internal variable
- * w32_showwindow in thread_intern and is therefore not implemented in Win32.xs.
- */
-/* FORWARD(SetChildShowWindow) */
-
-#undef FORWARD
-
void
Perl_init_os_extras(void)
{
dTHX;
char *file = __FILE__;
+ CV *cv;
dXSUB_SYS;
- /* these names are Activeware compatible */
- newXS("Win32::GetCwd", w32_GetCwd, file);
- newXS("Win32::SetCwd", w32_SetCwd, file);
- newXS("Win32::GetNextAvailDrive", w32_GetNextAvailDrive, file);
- newXS("Win32::GetLastError", w32_GetLastError, file);
- newXS("Win32::SetLastError", w32_SetLastError, file);
- newXS("Win32::LoginName", w32_LoginName, file);
- newXS("Win32::NodeName", w32_NodeName, file);
- newXS("Win32::DomainName", w32_DomainName, file);
- newXS("Win32::FsType", w32_FsType, file);
- newXS("Win32::GetOSVersion", w32_GetOSVersion, file);
- newXS("Win32::IsWinNT", w32_IsWinNT, file);
- newXS("Win32::IsWin95", w32_IsWin95, file);
- newXS("Win32::FormatMessage", w32_FormatMessage, file);
- newXS("Win32::Spawn", w32_Spawn, file);
- newXS("Win32::GetTickCount", w32_GetTickCount, file);
- newXS("Win32::GetShortPathName", w32_GetShortPathName, file);
- newXS("Win32::GetFullPathName", w32_GetFullPathName, file);
- newXS("Win32::GetLongPathName", w32_GetLongPathName, file);
- newXS("Win32::CopyFile", w32_CopyFile, file);
- newXS("Win32::Sleep", w32_Sleep, file);
+ /* load Win32 CORE stubs, assuming Win32CORE was statically linked */
+ if ((cv = get_cv("Win32CORE::bootstrap", 0))) {
+ dSP;
+ PUSHMARK(SP);
+ (void)call_sv((SV *)cv, G_EVAL|G_DISCARD|G_VOID);
+ }
+
newXS("Win32::SetChildShowWindow", w32_SetChildShowWindow, file);
}