-DirectoryIndex index.html
+DirectoryIndex Index.html.pl
AddType text/html .shtml
AddHandler server-parsed .shtml
RewriteEngine on
RewriteRule ^(/home/short/www/www.jankratochvil.net/)?sw/*(.*)$ http://www.jankratochvil.net/project/ [R=301] [L]
</Files>
+
+<IfDefine SSL>
+ <Files "*.pl">
+ RewriteEngine on
+ RewriteRule ^.*?/www[.]jankratochvil[.]net/(.*)$ http://localhost:7680/$1 [P]
+ </Files>
+</IfDefine>
+<IfDefine !SSL>
+ Options +ExecCGI
+</IfDefine>
#! /usr/bin/perl
#
# $Id$
-# Main page of 'My::Project::icp'
+# Main page Perl template.
# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
#
# This program is free software; you can redistribute it and/or modify
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
use vars qw($VERSION $CVS_ID);
$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::icp::ListItem;
+require 'CGI';
+require 'My::Project';
-My::Web->init_project(
- "ListItem"=>\%My::Project::icp::ListItem,
+my $W=My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'CV - Jan Kratochvil',
+ "footer_ids"=>0,
);
+My::Web->heading();
-print <<'HERE';
-<iframe src="Islet/" width="90%" height="500" />
-<a href="Islet/">Program on-line</a>.
-</iframe>
-HERE
-print '<table border="0"><tr><td align="center">'.My::Web::img("Islet.png","Applet demo screen").'</td></tr></table>'."\n";
+print "<h1>Nothing to see here, move along.</h1>\n";
+
My::Web->footer();
# Generally better behaviour but it requires GNU make. Harmless otherwise.
.DELETE_ON_ERROR:
-%.html: %.html.pl $(top_srcdir)/My/Web.pm $(top_srcdir)/WebConfig.pm
- perl -I$(top_srcdir) >$@ $<
-
%.ppm: %.fig Makefile
fig2dev -L ppm -S4 -b10 $< $@
%.gif: %.ppm
- ppmtogif -sort $< >$@
+ ppmtogif -quiet -sort $< >$@
+
+%.ppm: %.gif
+ giftopnm $< >$@
+
+%.png: %.ppm
+ pnmtopng $< >$@
+
+%.ppm: %.png
+ pngtopnm $< >$@
+
+%.png: %.dia $(top_srcdir)/dia-w.sh
+ $(top_srcdir)/dia-w.sh --nosplash --export $@ $<
include $(top_srcdir)/Makefile-head.am
AUTOMAKE_OPTIONS=foreign
-SUBDIRS=macros project
+SUBDIRS=macros My project
## to automatically rebuild aclocal.m4 if any of the macros in
## `macros/' change
@MAINT@include macros/macros.dep
Makefile-head.am \
autogen.pl \
.vimrc \
- ChangeLog
+ ChangeLog \
+ dia-w.sh.in
MAINTAINERCLEANFILES+= \
ChangeLog
CLEANFILES+= \
- ChangeLog.bak
+ ChangeLog.bak \
+ dia-w.sh
if MAINTAINER_MODE
ChangeLog:
endif
EXTRA_DIST+= \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl \
+ WebConfig.pm \
+ redirect.pl \
+ have_js.js.pl \
+ robots.txt \
+ CV.html.pl
@ISA=qw(Exporter);
@EXPORT=qw(%WebConfig);
+require CGI;
+
+
our %WebConfig=(
"admin_mail"=>'web-www.jankratochvil.net@jankratochvil.net',
- "viewcvs"=>map({ (!$_ ? $_ : s#^/#http://cvs.jankratochvil.net/viewcvs/energie/#); } $ENV{"SCRIPT_NAME"}),
+ "cvs_id_author"=>sub {
+ my($name)=@_;
+ return My::Web::a_href("http://www.jankratochvil.net/","Jan Kratochvil") if 0
+ || $name eq "short"
+ || $name eq "lace";
+ return CGI::escapeHTML($name);
+ },
+ "viewcvs"=>"http://cvs.jankratochvil.net/viewcvs/www/www.jankratochvil.net/",
"title_prefix"=>"Jan Kratochvil",
);
use Carp qw(cluck confess);
+die if $ENV{"SERVER_SOFTWARE"}; # SECURITY: CGI misuse!
+
AutoGen->run(
"name"=>"www.jankratochvil.net",
"COPYRIGHT_HOLDER"=>'Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>',
"clean"=>[qw(
./ChangeLog.bak
./INSTALL
+ ./dia-w.sh
./project/Nokia61/Nokia61
./project/Nokia61/Nokia61_23.cache
+ ./project/surprise/surprise-gnome-0.gif
+ ./project/line9k/line9k.png
./project/line9k/line9k.gif
- *.html
+ ./project/captive/doc/fig/*.png
+ ./project/captive/doc/fig/*.gif
+ ./project/captive/doc/dia/*.png
+ ./project/captive/doc/dia/*.gif
)],
);
AM_INIT_AUTOMAKE(www.jankratochvil.net,1.0cvs)
AM_MAINTAINER_MODE
+AC_PATH_PROG(PATH_XVNC,Xvnc)
+AC_PATH_PROG(PATH_BC,bc)
+AC_PATH_PROG(PATH_DIA,dia)
+
dnl "Makefile" output files MUST have pathnames incl./excl. "./" prefix as specified!
AC_OUTPUT([
Makefile
+./dia-w.sh
./macros/Makefile
+./My/Makefile
./project/Makefile
./project/step/Makefile
./project/icp/Makefile
./project/ppp9k/Makefile
./project/LaceMail/Makefile
./project/line9k/Makefile
+./project/captive/Makefile
+./project/captive/apiref/Makefile
+./project/captive/doc/Makefile
+./project/captive/doc/fig/Makefile
+./project/captive/doc/dia/Makefile
])
echo done.
--- /dev/null
+#! /bin/bash
+# $Id$
+# Try to run "dia" with '-e' option, Xvnc wrapping if needed.
+# Copyright (C) 2000,2003 Jan Kratochvil <project-macros@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+empty=
+if test "x@PATH_XVNC@" != "x@PATH_XVNC$empty@"
+then
+ PATH_XVNC="@PATH_XVNC@"
+fi
+if test "x@PATH_BC@" != "x@PATH_BC$empty@"
+then
+ PATH_BC="@PATH_BC@"
+fi
+if test "x@PATH_DIA@" != "x@PATH_DIA$empty@"
+then
+ PATH_DIA="@PATH_DIA@"
+else
+ PATH_DIA=dia
+fi
+
+unset xpid
+if test "x$PATH_XVNC" != "x"
+then
+ xport=$[($$%4096)+2000]
+ notdone=true
+ run=true
+ while $notdone
+ do
+ if test -r /proc/net/tcp -a "x$PATH_BC" != "x"
+ then
+ loop=true
+ while $loop
+ do
+ hex="`echo "obase=16;$[$xport+5900]"|$PATH_BC`"
+ if grep -q ":`echo "000$hex"|tail -c5` " /proc/net/tcp
+ then
+ if $run
+ then
+ xport=$[$xport+1]
+ else
+ notdone=false
+ loop=false
+ fi
+ else
+ if $run
+ then
+ loop=false
+ else
+ echo -n .
+ sleep 1
+ fi
+ fi
+ done
+ else
+ notdone=$run
+ fi
+ if $run
+ then
+ export DISPLAY=":$xport"
+ $PATH_XVNC $DISPLAY & xpid=$!
+ run=false
+ fi
+ done
+else
+ if test "x$DISPLAY" = "x"
+ then
+ export DISPLAY=":0"
+ fi
+fi
+
+$PATH_DIA --disable-crash-dialog "$@";r=$?
+
+if test "x$xpid" != "x"
+then
+ kill $xpid
+fi
+
+exit $r
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# JavaScript detection scriptlet Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+use vars qw($VERSION $CVS_ID);
+$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+$CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+
+
+my $W=My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Homepage of Jan Kratochvil',
+ );
+# Do not: My::Web->heading();
+$W->{"r"}->send_http_header("text/javascript");
+
+# Prevent redirection of some top (referring) foreign webpage as it
+# may not pass "have_js=1" to us anyway. (for example Google cache)
+print ""
+ .'if (0'."\n"
+ ."\t\t".'|| window.location.hostname=="'.$W->{"r"}->hostname().'" && window.location.port== 80'."\n"
+ ."\t\t".'|| window.location.hostname=="'.'localhost' .'" && window.location.port==7680)'."\n";
+print <<'HERE';
+ {
+ var searchN=window.location.search;
+ if (searchN=="" || searchN=="?")
+ searchN="?";
+ else
+ searchN+="&";
+ searchN+="have_js=1";
+
+ window.location.href
+ =window.location.protocol+"//"
+ +window.location.hostname
+ +(window.location.port==80 ? "" : ":"+window.location.port)
+ +window.location.pathname
+ +window.location.hash
+ +searchN;
+ }
+HERE
+
+# Do not: My::Web->footer();
+++ /dev/null
-#! /usr/bin/perl
-#
-# $Id$
-# Main page Perl template.
-# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; exactly version 2 of June 1991 is required
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
-use strict;
-use warnings;
-
-use My::Web;
-use Carp qw(cluck confess);
-
-
-My::Web->init(
- "title"=>'Homepage of Jan Kratochvil alias Lace',
- );
-My::Web->heading();
-
-print <<'HERE';
-<h1>Jan Kratochvil</h1>
-<hr />
-
-<h2><a href="project/">Software projects</a></h2>
-<blockquote>
-<p>List of my software projects</p>
-</blockquote>
-
-<h2><a href="http://cvs.jankratochvil.net/">ViewCVS of my CVS repository</a></h2>
-<blockquote>
-<p>My public CVSROOT; Accessible storage of all of my projects, config files, webs and more.</p>
-</blockquote>
-
-<h2>Contact</h2>
-<blockquote>
-<p>e-mail: <a href="mailto:web-www.jankratochvil.net@jankratochvil.net">web-www.jankratochvil.net@jankratochvil.net</a></p>
-</blockquote>
-
-HERE
-
-My::Web->footer();
+++ /dev/null
-Options +ExecCGI
-DirectoryIndex list.cgi.pl index.html
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::FordFulk::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::FordFulk::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::FordFulk::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::FordFulk::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::FordFulk;
+package project::FordFulk::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Ford-Fulkenson Algorithm Demonstration",
"priority"=>5,
"download"=>"FordFulk/FordFulk.zip",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::Heat::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::Heat::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::Heat::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::Heat::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::Heat;
+package project::Heat::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Heat Distribution Simulation",
"priority"=>5,
"download"=>"Heat/Heat.zip",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-use lib qw(/home/short/lib/perl5/site_perl/5.6.0/i386-linux /home/short/lib/perl5/site_perl/5.6.0 /home/short/lib/perl5/site_perl/i386-linux /home/short/lib/perl5/site_perl /home/short/lib/perl5/5.6.0/i386-linux /home/short/lib/perl5/5.6.0 /home/short/lib/perl5/i386-linux /home/short/lib/perl5);
-
-use lib "../";
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-require CGI;
+require 'CGI';
+require 'My::Project';
use constant ENTRIES=>"CVS/Entries";
use constant ENTRIES_LOG=>"CVS/Entries.Log";
My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
"title"=>'Project List',
);
My::Web->heading();
print <<'HERE';
<h1>Project List of <a href="mailto:web-www.jankratochvil.net@jankratochvil.net">Jan Kratochvil</a></h1>
-<form action="list.cgi.pl" method="get"><p>
+<form action="Index.pl" method="get"><p>
<select name="description_opt" onchange="this.form.submit();">
HERE
print '<option value="0"'.(!$CGI->param("description_opt") ? ' selected="selected"' : '').'>only list</option>'."\n";
my %item;
for my $dir (keys(%dirs)) {
- require "$dir/ListItem.pm";
- my $item=eval('\%My::Project::'.$dir.'::ListItem');
- do { warn "Broken $dir/List.pm"; next; } if !defined %$item;
- $item{$dir}=$item;
+ require "project::${dir}::ListItem";
+ my $item=eval('\@project::'.$dir.'::ListItem::ListItem');
+ do { warn "Broken project/$dir/ListItem.pm"; next; } if !defined $item;
+ $item{$dir}={ My::Project::project_arr_to_hash(@$item) };
}
# $col{"name"}{"show"}=1
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::icp'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::icp::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+use My::Project;
+use project::icp::ListItem;
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::icp::ListItem::ListItem,
+ );
+
+print <<'HERE';
+<iframe src="Islet/" width="90%" height="500" />
+<a href="Islet/">Program on-line</a>.
+</iframe>
+HERE
+
+print '<table border="0"><tr><td align="center">'.My::Web::img("Islet","Applet demo screen").'</td></tr></table>'."\n";
+
+My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::icp;
+package project::icp::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>'<a href="http://www.stv.cz/icp/">ICP 1998</a> Competition Software',
"priority"=>5,
"download"=>"Islet/Islet.zip",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
cvsbranchdiff \
ppp9k \
LaceMail \
- line9k
+ line9k \
+ captive
EXTRA_DIST+= \
- list.cgi.pl
-
-#noinst_DATA+= \
-# index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::Nokia61::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::Nokia61::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::Nokia61::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::Nokia61::ListItem::ListItem,
);
+do { system 'make >&2 -s '.$_ if ! -f $_; } for ("./Nokia61");
print <<'HERE';
<iframe src="Nokia61.php?base=.%2F" width="90%" height="500" />
<a href="Nokia61.php?base=.%2F">Program on-line</a>.
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::Nokia61;
+package project::Nokia61::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Nokia Game "Rotation"",
"priority"=>7,
"download"=>"Nokia61.c",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html \
- Nokia61
+ Index.html.pl
Nokia61: Nokia61.c
gcc -Wall -ggdb3 -o $@ $<
+
+CLEANFILES+= \
+ Nokia61 \
+ Nokia61_23.cache
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::badblock_guess::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::badblock_guess::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::badblock_guess::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::badblock_guess::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::badblock_guess;
+package project::badblock_guess::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Recovery of Data from a Damaged Disk",
"priority"=>7,
"download-compiled static binary"=>"badblock-guess",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::captive'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+use My::Project;
+use project::captive::ListItem;
+
+
+my $W=My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::captive::ListItem::ListItem,
+ "head_css"=>"
+.reqpkg { font-style: italic; }
+.stuff { font-style: italic; font-size: larger; margin-left: 20%; margin-right: 10%; }
+.re { font-style: italic; }
+",
+ );
+
+
+print vskip("10ex")."<h1 align=\"center\">!!! DO NOT DISCLOSE - **************** !!!</h1>\n".vskip("10ex");
+
+print <<"HERE";
+<h1>The First Read/Write NTFS for Free Operating Systems</h1>
+<h1>The First Free Microsoft Windows Kernel API Emulation</h1>
+HERE
+
+my @stuff=(
+ "A lot of people claim themselves as Windows Programmers.\n"
+ ." Now I can finally join them - I also wrote my own Microsoft Windows.",
+ "Why do they need <a href=\"http://www.winsupersite.com/reviews/winserver2k3_gold2.asp\">5000 developers</a>"
+ ." to write Microsoft Windows when it is just One Man Show task?",
+
+
+
+ "My first Microsoft Windows program ever written? Some 'helloworld'?"
+ ." <span class=\"quote\">hal.dll</span>.",
+ );
+
+print "<p class=\"stuff\">$_</p>\n" for (@stuff);
+print vskip "3ex";
+
+
+print <<'HERE';
+<table border="1" align="center" style="text-align: center;"><tr><th>Distribution</th>
+ <th>Installation Case #1<br />Filesystem and installer<br />(recommended)</th>
+ <th>Installation Case #2<br />Manual installation<br />(filesystem available)</th>
+ <th>Installation Case #3<br />Command-line client<br />(no filesystem access)</th></tr>
+HERE
+my %pkg=(
+ 1=>[qw(captive captive-lufs captive-install lufs gnome-vfs-httpcaptive ntfsprogs ntfsprogs-gnomevfs)],
+ 2=>[qw(captive captive-lufs lufs)],
+ 3=>[qw(captive)],
+ );
+my %reqpkg=(
+ 1=>[qw(glib2 gnome-vfs2 ORBit2 libxml2 openssl popt libgnomeui)],
+ 2=>[qw(glib2 gnome-vfs2 ORBit2 libxml2 openssl popt)],
+ 3=>[qw(glib2 gnome-vfs2 ORBit2 libxml2 openssl popt readline)],
+ );
+my %version=(
+ map(($_=>["0.9","0"]),qw(captive captive-lufs captive-install)),
+ "lufs"=>["0.9.6","1captive1"],
+ "gnome-vfs-httpcaptive"=>["2.3.8captive2","0"],
+ "ntfsprogs"=>["200309071734","1captive1"],
+ "ntfsprogs-gnomevfs"=>["1.0","0"],
+ );
+my %has_rh8=(map(($_=>1),qw(
+ gnome-vfs-httpcaptive
+ captive
+ captive-lufs
+ captive-install
+ )));
+my %has_mdk91=(map(($_=>1),qw(
+ gnome-vfs-httpcaptive
+ lufs
+ captive
+ captive-lufs
+ captive-install
+ )));
+my %has_devel=(map(($_=>1),qw(
+ ntfsprogs
+ )));
+my %pkg_nosrc=(map(($_=>1),qw(
+ captive-lufs
+ captive-install
+ )));
+my @dist=(
+ {
+ "name"=>"Red Hat 9<br />Shrike i386",
+ "out"=>sub {
+ my($pkg,$version_base,$version_ext)=@_;
+ my $file="$pkg-$version_base-$version_ext.i386.rpm";
+ my $r=a_href "dist/$file",$file;
+ (my $filedev=$file)=~s/^\Q$pkg\E-/${pkg}-devel-/;
+ $r.="<br />".a_href("dist/$filedev",$filedev) if $has_devel{$pkg};
+ return $r;
+ },
+ },
+ {
+ "name"=>"Red Hat 8<br />Psyche i386",
+ "out"=>sub {
+ my($pkg,$version_base,$version_ext)=@_;
+ my $file="$pkg-$version_base-$version_ext".(!$has_rh8{$pkg} ? "" : "rh8").".i386.rpm";
+ my $r=a_href "dist/$file",$file;
+ (my $filedev=$file)=~s/^\Q$pkg\E-/${pkg}-devel-/;
+ $r.="<br />".a_href("dist/$filedev",$filedev) if $has_devel{$pkg};
+ if ($pkg eq "captive-install") {
+ for (qw(libxml2-2.5.4-1.i386.rpm libxml2-python-2.5.4-1.i386.rpm)) {
+ $r.="<br />".a_href('ftp://ftp.redhat.com/pub/redhat/linux/9/en/os/i386/RedHat/RPMS/'.$_,$_)." of Red Hat 9";
+ }
+ }
+ return $r;
+ },
+ },
+ {
+ "name"=>"Mandrake 9.1<br />Bamboo i586",
+ "out"=>sub {
+ my($pkg,$version_base,$version_ext)=@_;
+ my $file="$pkg-$version_base-$version_ext".(!$has_mdk91{$pkg} ? ".i386.rpm" : "mdk91.i586.rpm");
+ my $r=a_href "dist/$file",$file;
+ (my $filedev=$file)=~s/^\Q$pkg\E-/${pkg}-devel-/;
+ $r.="<br />".a_href("dist/$filedev",$filedev) if $has_devel{$pkg};
+ return $r;
+ },
+ },
+ {
+ "name"=>"Red Hat .src.rpm<br />(of 9 - Shrike)",
+ "out"=>sub {
+ my($pkg,$version_base,$version_ext)=@_;
+ return () if $pkg_nosrc{$pkg};
+ my $file="$pkg-$version_base-$version_ext.src.rpm";
+ return $file,$file;
+ },
+ },
+ {
+ "name"=>"Debian GNU/Linux<br />'unstable' i386",
+ "out"=>sub {
+ my($pkg,$version_base,$version_ext)=@_;
+ $version_ext=~s/^\d+//;
+ my $file="${pkg}_$version_base".($version_ext=~/^\d+$/ ? "" : $version_ext)."_i386.deb";
+ my $r=a_href "dist/$file",$file;
+ (my $filedev=$file)=~s/^\Q$pkg\E_/${pkg}-dev_/;
+ $r.="<br />".a_href("dist/$filedev",$filedev) if $has_devel{$pkg};
+ return $r;
+ },
+ },
+ {
+ "name"=>"Debian GNU/Linux<br />sources",
+ "out"=>sub {
+ my($pkg,$version_base,$version_ext)=@_;
+ return () if $pkg_nosrc{$pkg};
+ $version_ext=~s/^\d+//;
+ my $file="${pkg}_$version_base".($version_ext=~/^\d+$/ ? "" : $version_ext);
+ return CGI::escapeHTML($file).":"
+ .' ' .a_href("dist/$file.dsc",".dsc","size"=>0)
+ .' '.a_href("dist/$file.tar.gz",".tar.gz");
+ },
+ },
+ {
+ "name"=>"Sources (.tar.gz)",
+ "out"=>sub {
+ my($pkg,$version_base,$version_ext)=@_;
+ return () if $pkg_nosrc{$pkg};
+ $version_ext=~s/^\d+//;
+ my $file="$pkg-$version_base".($version_ext=~/^\d+$/ ? "" : $version_ext).".tar.gz";
+ return $file,$file;
+ },
+ },
+ );
+
+for my $dist (@dist) {
+ print "<tr>";
+ print "<td>".$dist->{"name"}."</td>";
+ for my $case (1,2,3) {
+ print "<td>";
+ print join("<br />",map({ my $pkg=$_;
+ my($file,$text)=&{$dist->{"out"}}($pkg,@{$version{$pkg}});
+ (!defined $text ? ($file) || () : (a_href("dist/$file",$text)));
+ } @{$pkg{$case}}));
+ print "</td>";
+ }
+ print "</tr>\n";
+ }
+print <<'HERE';
+</table>
+HERE
+
+print vskip "3ex";
+
+print <<"HERE";
+<h1>Installation notes</h1>
+
+<p>You should first run <b>captive-install-acquire</b> command to check your
+available Microsoft Windows drivers versions. Now you can execute:</p>
+
+<blockquote>
+<p class="quote"># mount -t captive-ntfs /dev/hda1 /mnt/dosc</p>
+</blockquote>
+
+<h2>Package version conflicts</h2>
+
+<dl>
+
+<dt><a href="http://lufs.sourceforge.net/lufs/">lufs</a></dt>
+<dd><p><b>'captive' version required</b>: Although you may already have the
+original package installed you must replace it by the local 'captive'-marked
+version containing some 'captive'-essential fixes and extensions.</p></dd>
+
+<dt><a href="http://linux-ntfs.sourceforge.net/">ntfsprogs</a></dt>
+<dd><p><b>Original version >=200309071734 sufficient</b>:
+The package downloadable here has no code patches - you can freely use the
+original version instead. Unfortunately the last public release is
+<b>1.7.1</b> while this project requires at least
+<a href="http://linux-ntfs.sourceforge.net/snapshots/">snapshot</a> version
+<b><a href="http://linux-ntfs.sourceforge.net/snapshots/ntfsprogs-200309071734.tar.bz2">200309071734</a></b>
+which is not packaged (.rpm/.deb) yet. Packaged versions are provided here for
+your convenience.</p></dd>
+
+</dl>
+
+
+<h2>LUFS kernel driver module</h2>
+
+<p><a href="http://lufs.sourceforge.net/lufs/">LUFS</a> (Linux Userland File
+System) needs Linux kernel module driver (<i>lufs.o</i>) compatible with your
+running Linux kernel. Binary driver is supplied already precompiled for many
+Linux kernel versions in the binary packages above (<b>.i386.rpm</b> and
+<b>_i386.deb</b> archives).</p>
+
+<p>If you cannot <b>mount</b>(8) your NTFS filesystem you should run <span
+class="quote">/usr/share/lufs/prepmod</span> to see the reasons. It is always
+recommended to upgrade to latest stable kernel supplied by your GNU/Linux
+distribution vendor. In the case you are running kernel not supported by the
+precompiled set of binary modules you should install package
+<b>kernel-source</b> (Red Hat) or <b>kernel-headers</b> (Debian) matching your
+Linux kernel version (<b>rpm -q kernel</b>) and re-run <span
+class="quote">/usr/share/lufs/prepmod</span>.</p>
+
+
+<h2>The First Free Microsoft Windows Kernel API Emulation</h2>
+
+<p>Compatibility with existing binary Microsoft Windows file system drivers was
+reached. Microsoft Windows kernel system components required by these drivers
+were analyzed and successfuly emulated in the GNU/Linux operating system.
+Project brings Microsoft Windows kernel emulation framework to support even
+other types Microsoft Windows drivers in the future.</p>
+
+<dl>
+ <dt>Emulation principle equivalent</dt>
+ <dd>
+ <p>@{[ a_href('http://www.winehq.com/','Wine Project') ]}</p>
+ <p>No code could be shared - Wine emulates only Microsoft Windows userland.
+ Filesystem drivers completely belong to Microsoft Windows kernelland.</p>
+ </dd>
+
+ <dt>Closed-source read-only-crippled @{[ '$0' ]} equivalent for Microsoft Windows</dt>
+ <dd>
+ <p>@{[ a_href('http://www.sysinternals.com/ntw2k/freeware/ntfswin98.shtml',
+ 'NTFS for Windows 98') ]}</p>
+ <p>There is a @{[ a_href('http://www.sysinternals.com/images/screenshots/ntfs98ap.gif',
+ 'diagram') ]} showing exactly the principle of Captive NTFS project.
+ There is apparently disabled read/write functionality in <i>NTFS for
+ Windows 98</i> as the same company also sells the following product sharing
+ the same codebase:</p>
+ </dd>
+
+ <dt>Closed-source read/write @{[ '$299' ]} equivalent for MS-DOS</dt>
+ <dd>
+ <p>@{[ a_href('http://www.winternals.com/products/repairandrecovery/ntfsdospro.asp',
+ 'NTFSDOS Professional') ]}</p>
+ <p>This product is the most close equivalent to Captive NTFS but it is
+ a commercial product, closed-source and it has filesystem interface only
+ for MS-DOS.</p>
+ </dd>
+
+ <dt>The only real competition: Closed-source read/write @{[ '$299' ]} equivalent</dt>
+ <dd>
+ <p>@{[ a_href('http://www.vmware.com/download/workstation.html',
+ 'VMware Workstation') ]}</p>
+ <p>Original Microsoft Windows operating system can be run inside a virtual
+ machine running under GNU/Linux and share the read-write NTFS disk by using
+ a network file sharing through a VMware virtual network card.</p>
+ <p>You need @{[ '$299' ]} for this product and you need to
+ give up your system security by running un<a href="#sandbox">sandbox</a>ed
+ closed-source program in your GNU/Linux.</p>
+ </dd>
+</dl>
+
+
+<h2>Security</h2>
+
+<p><b>Re: <a href="http://linux-ntfs.sourceforge.net/info/ntfs.html#7.7">7.7
+ Can't we write a wrapper for Windows' driver?</a></<b></p>
+
+<p class="re">> It sounds like a great idea, to start with, but there are numerous
+problems.</p>
+
+<p><span class="re">> The largest technical problem is joining the Windows
+system DLL to the Linux VFS. It could be done, but it wouldn't be pretty.</span><br />
+Yep. :-)</p>
+
+<p><span class="re">> It would have to run as part of the kernel which would mean
+that if it went wrong it could crash the machine. With no source, we might not
+be able to work around the problem.</span><br />
+<a name="sandbox">Nope</a>,
+@{[ a_href('http://lufs.sourceforge.net/lufs/','Linux Userland File System (LUFS)') ]}
+moves the filesystem implementation to UNIX userland where the Microsoft
+Windows filesystem is completely unarmed by Captive jail of chroot(2),
+setuid(2) and setrlimit(2). There only remains one narrow connection to the rest of
+system (by CORBA/ORBit). The filesystem's life environment gets kill(2)ed when
+UNIX is no longer satisfied with it. Safety similiar to
+@{[ a_href('http://www.vmware.com/solutions/security.html','VMware sandbox') ]}.</p>
+
+<p><span class="re">> The next major problem is compati<!--orig. text typo-->bility.
+Which version of the Windows system file would we use? Picking one would limit
+its use, making the wrapper versatile for all of them would be a programming
+nightmare.</span><br />
+Microsoft Windows NTFS filesystem driver is capable of accessing older formats
+of the filesystem. This project currently runs Microsoft Windows XP version,
+porting to Microsoft Windows 2003 Server expected. (Microsoft Windows upgrades
+NTFS disk filesystem to its own version during complete CD-ROM Microsoft
+Windows system installation - such operation is not threat this project use.)</p>
+
+<p><span class="re">> And it gets worse. The legal implications of
+distributing Windows systems files would cause problems.</span><br />
+User must be careful to obey all licensing restrictions according to his
+local country laws.<br />
+<span class="re">> Also the proprietary nature of the driver would mean that
+the other kernel coders would not investigate any problems if someone had used
+the NTFS wrapper.</span><br />
+It does not apply to this project due to the implemented
+<a href="#sandbox">filesystem separation</a>.</p>
+
+@{[ vskip "3ex" ]}
+
+<h1>See also</h1>
+<ul>
+ <li>@{[ a_href('Preview.html.pl','Technology Preview') ]}</li>
+ <li>@{[ a_href('doc/','Developer Documentation') ]}</li>
+ <li>@{[ a_href('apiref/','API Reference Manual') ]} (fragment)</li>
+ <li>
+ @{[ a_href('http://cvs.jankratochvil.net/viewcvs/priv/captive/','CVS repository ViewCVS') ]}
+ (@{[ a_href('http://cvs.jankratochvil.net/viewcvs/priv/reactos/?only_with_tag=captive','ReactOS branch part') ]})
+ </li>
+ <li>@{[ a_href('Thanks.html.pl','Thanks') ]}</li>
+ <li>@{[ a_href('Resources.html.pl','Related Pages') ]}</li>
+</ul>
+
+@{[ vskip "3ex" ]}
+
+<p class="stuff">
+ Why did I install Microsoft Windows and wrote such disgusting piece of code?<br />
+ I expect @{[ a_href($W->{"top_dir"}."/CV.html.pl","yet another challenging task") ]}, !
+</p>
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::captive' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+
+our @ListItem=(
+ "name"=>"Captive NTFS Filesystem",
+ "priority"=>9,
+ "summary"=>"MS-Windows NT kernel emulation",
+ "license"=>"GPL",
+ "maintenance"=>"active",
+ "language"=>"C, i386 asm, Perl",
+ "description"=>""
+ .'<p>The implementation allows applications running under the GNU/Linux operating'
+ .' system to access NTFS drives. File system driver compatibility with VFAT,'
+ .' ISO9660 and EXT2 is also provided.</p>'
+ .'<p>Project runs the original Microsoft Windows drivers to get the best'
+ .' filesystem compatibility and safety ever reachable.</p>'
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/captive/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+SUBDIRS= \
+ doc
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl \
+ Thanks.html.pl \
+ Resources.html.pl \
+ Preview.html.pl
#! /usr/bin/perl
#
# $Id$
-# Main page of 'My::Project::pipebuf'
+# Captive project Preview page Perl template.
# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
#
# This program is free software; you can redistribute it and/or modify
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::captive::Preview;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
use vars qw($VERSION $CVS_ID);
$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::pipebuf::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::pipebuf::ListItem,
+My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Technology Preview',
);
+My::Web->heading();
+
+print "<h1>Captive NTFS Technology Preview</h1>\n";
+
+print img("doc/dia/parent-connector","Parent connector");
+
+
My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project Resources page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::Resources;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+use vars qw($VERSION $CVS_ID);
+$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+$CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+
+
+My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Internet Resources',
+ );
+My::Web->heading();
+
+
+print "<h1>Captive NTFS Internet Resources</h1>\n";
+print "<ul>\n";
+ my @URLs=(
+# no longer valid: 'NTFS Preinstallation and Windows XP'=>'http://www.microsoft.com/hwdev/tech/storage/ntfs-preinstallP.asp',
+ 'Linux-NTFS Project'=>'http://linux-ntfs.sourceforge.net/',
+ 'ReactOS Project'=>'http://www.reactos.com/',
+ 'Ext2 File System Driver'=>'http://sys.xiloo.com/projects/projects.htm#ext2fsd',
+ 'Wine Project'=>'http://www.winehq.com/',
+ 'Memory Support and Windows Operating Systems'=>'http://www.microsoft.com/whdc/hwdev/platform/server/PAE/PAEmem.mspx',
+ 'GnomeVFS - Filesystem Abstraction library'=>'http://developer.gnome.org/doc/API/gnome-vfs/',
+ 'Linux Userland File System (LUFS)'=>'http://lufs.sourceforge.net/lufs/',
+ 'Partition Surprise'=>'http://surprise.sourceforge.net/',
+ 'ntfsresize'=>'http://mlf.linux.rulez.org/mlf/ezaz/ntfsresize.html',
+ 'NTPwd NTFS driver'=>'http://www.cgsecurity.org/ntfs.html',
+ 'Microsoft Windows XP Service Pack 1a'
+ =>'http://download.microsoft.com/download/9/7/6/9763833d-bd58-41e2-9911-50f64c7252a3/xpsp1a_en_x86_CHK.exe',
+ 'The NT Cache Manager Description'=>'http://www.osr.com/ntinsider/1996/cacheman.htm',
+ 'Learn About NT'."'".'s File-system Cache'=>'http://www.winntmag.com/Articles/Print.cfm?ArticleID=3864',
+ 'NT File System Developers mailing list'=>'http://www.ntfsd.org/archive/',
+ 'IDA Freeware'=>'http://www.simtel.net/pub/pd/29498.html',
+ 'Argument Passing and Naming Conventions'
+ =>'http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_core_argument_passing_and_naming_conventions.asp',
+ 'MS-DOS FAT Filesystems Support on Linux'=>'ftp://ftp.uni-erlangen.de/pub/Linux/LOCAL/dosfstools/',
+ 'MSDN (Microsoft Developer Network) Kernel-Mode Driver Architecture: Windows DDK'
+ =>'http://msdn.microsoft.com/library/default.asp?url=/library/en-us/kmarch/hh/kmarch/kmhdr_6enb.asp',
+ 'GLib, Gnome Utility Library'=>'http://developer.gnome.org/doc/API/2.0/glib/',
+ 'VMware Workstation'=>'http://www.vmware.com/download/workstation.html',
+ );
+ for (my @URLa=@URLs;@URLa;) {
+ my $text=shift @URLa;
+ my $url=shift @URLa;
+ print "\t<li>".a_href($url,CGI::escapeHTML($text))."</li>\n";
+ }
+print "</ul>\n";
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project Thanks page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::Thanks;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+use vars qw($VERSION $CVS_ID);
+$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+$CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+
+
+My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Thanks',
+ "head_css"=>"
+.name { font-style: italic; }
+",
+ );
+My::Web->heading();
+
+print <<'HERE';
+<h1>Captive NTFS Thanks</h1>
+
+<ul>
+HERE
+
+sub name ($;$$)
+{
+my($name,$pos,$why)=@_;
+
+ my $r="<li>";
+ $r.='<span class="name">'.$name.'</span>';
+ $r.=", $pos" if $pos;
+ $r.=" - $why" if $why;
+ $r.="</li>\n";
+ return $r;
+}
+
+print name "Karel Zatoukal",a_href("http://www.sun.com/","Sun Microsystems");
+print name "Tim Boudreau",a_href("http://www.sun.com/","Sun Microsystems");
+print name a_href_cz('http://www.itpravo.cz/admin.shtml?x=45480','Jiri Cermak'),
+ a_href("http://www.bakernet.com/",'Baker & McKenzie'),
+ 'preflight IT law analysis';
+print name a_href('http://www.ucw.cz/~mj/','Martin "MJ" Mares');
+print name a_href("http://sys.xiloo.com/","Matt Wu"),
+ a_href("http://sys.xiloo.com/projects/projects.htm#ext2fsd","Ext2fsd")." developer","W32 tips";
+print name "Lubomir Bulej";
+print name "Tomas Bures";
+print name a_href_cz('http://www.klokan.cz/','Lukas "Klokan" Horalek'),undef(),"services hosting";
+
+print name "Steven Edwards" ,a_href("http://www.reactos.com/","ReactOS")." developer","W32 tips";
+print name "Casper Hornstrup",a_href("http://www.reactos.com/","ReactOS")." developer","W32 tips";
+print <<'HERE';
+<li>Betatesting
+ <ul>
+ <li>?</li>
+ </ul></li>
+<li>Last but not least - greetings to Danese Cooper, Open Source Diva!</li>
+</ul>
+
+HERE
+
+My::Web->footer();
--- /dev/null
+DirectoryIndex index.html
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/captive/ API reference doc
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ captive-apiref-calltype-reactos.html \
+ captive-apiref-init.html \
+ captive-apiref-ldr-exports.html \
+ captive-apiref-ldr.html \
+ captive-apiref-macros.html \
+ captive-apiref-mm.html \
+ captive-apiref-ps-reactos.html \
+ captive-apiref-rtl-file.html \
+ captive-apiref-signal.html \
+ captive-apiref-storage.html \
+ captive-apiref-unicode-reactos.html \
+ captive-apiref-unicode.html \
+ captive-apiref.devhelp \
+ ch01.html \
+ index.html \
+ home.png \
+ left.png \
+ right.png \
+ up.png
+
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>calltype_reactos</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-ldr-exports.html" title="ldr_exports"><link rel="next" href="captive-apiref-signal.html" title="signal"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-ldr-exports.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-signal.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-calltype-reactos"></a><div class="titlepage"></div><div class="refnamediv"><h2>calltype_reactos</h2><p>calltype_reactos — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+#define <a href="captive-apiref-calltype-reactos.html#CAPTIVE-CDECL-CAPS">CAPTIVE_CDECL</a>
+#define <a href="captive-apiref-calltype-reactos.html#CAPTIVE-STDCALL-CAPS">CAPTIVE_STDCALL</a>
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="CAPTIVE-CDECL-CAPS"></a>CAPTIVE_CDECL</h3><pre class="programlisting">#define CAPTIVE_CDECL __attribute__((__cdecl__))
+</pre><p>
+Function call type declaration for the real CDECL call type.
+As the default CDECL macro gets disabled (=NOP) during reactos sources
+compilation (and gets undefined to cause error during non-reactos sources
+compilation) you have the chance to do the real CDECL declaration
+by using <a href="captive-apiref-calltype-reactos.html#CAPTIVE-CDECL-CAPS">CAPTIVE_CDECL</a>. You must ifdef it by <tt>LIBCAPTIVE</tt> symbol as it
+is not available during standalone reactos compilation.
+</p><p>
+This macro may be needed to pass control to W32 binary code.</p><p>
+
+</p></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-STDCALL-CAPS"></a>CAPTIVE_STDCALL</h3><pre class="programlisting">#define CAPTIVE_STDCALL __attribute__((__stdcall__))
+</pre><p>
+Function call type declaration for the real STDCALL call type.
+As the default STDCALL macro gets disabled (=NOP) during reactos sources
+compilation (and gets undefined to cause error during non-reactos sources
+compilation) you have the chance to do the real STDCALL declaration
+by using <a href="captive-apiref-calltype-reactos.html#CAPTIVE-STDCALL-CAPS">CAPTIVE_STDCALL</a>. You must ifdef it by <tt>LIBCAPTIVE</tt> symbol as it
+is not available during standalone reactos compilation.
+</p><p>
+This macro may be needed to pass control to W32 binary code.</p><p>
+
+</p></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-ldr-exports.html"><b><< ldr_exports</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-signal.html"><b>signal >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>init</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="ch01.html" title="Operation Captive"><link rel="next" href="captive-apiref-ldr.html" title="ldr"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="ch01.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-ldr.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-init"></a><div class="titlepage"></div><div class="refnamediv"><h2>init</h2><p>init — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+gboolean <a href="captive-apiref-init.html#captive-init">captive_init</a> (void);
+gboolean <a href="captive-apiref-init.html#captive-shutdown">captive_shutdown</a> (void);
+void <a href="captive-apiref-init.html#captive-log-init">captive_log_init</a> (const struct captive_options *captive_options);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-init"></a>captive_init ()</h3><pre class="programlisting">gboolean captive_init (void);</pre><p>
+Expects captive_options: Parsed by captive_options_parse().
+<tt>NULL</tt> value is forbidden. Field image_iochannel <tt>NULL</tt> value is forbidden.
+</p><p>
+Initializes <tt>libcaptive</tt> and loads the specified filesystem.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if successfuly initialized.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-shutdown"></a>captive_shutdown ()</h3><pre class="programlisting">gboolean captive_shutdown (void);</pre><p>
+Closes down <tt>libcaptive</tt>. It should flush all pending buffers and successfuly
+close the filesystem. Variable captive_options->image_iochannel will not be set to <tt>NULL</tt>,
+you should close such channel yourself.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if successfuly shutdown.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-log-init"></a>captive_log_init ()</h3><pre class="programlisting">void captive_log_init (const struct captive_options *captive_options);</pre><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>captive_options</tt></i>Â :</span></td><td>
+
+
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="ch01.html"><b><< Operation Captive</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-ldr.html"><b>ldr >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>ldr_exports</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-storage.html" title="storage"><link rel="next" href="captive-apiref-calltype-reactos.html" title="calltype_reactos"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-storage.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-calltype-reactos.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-ldr-exports"></a><div class="titlepage"></div><div class="refnamediv"><h2>ldr_exports</h2><p>ldr_exports — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+gboolean <a href="captive-apiref-ldr-exports.html#captive-kernel-exports">captive_kernel_exports</a> (void);
+gboolean <a href="captive-apiref-ldr-exports.html#captive-kernel-patches">captive_kernel_patches</a> (void);
+gboolean <a href="captive-apiref-ldr-exports.html#captive-ModuleList-add-builtin">captive_ModuleList_add_builtin</a> (const gchar *FullName_utf8,
+ ...);
+gboolean <a href="captive-apiref-ldr-exports.html#captive-ModuleList-patch">captive_ModuleList_patch</a> (const gchar *FullName_utf8,
+ ...);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-kernel-exports"></a>captive_kernel_exports ()</h3><pre class="programlisting">gboolean captive_kernel_exports (void);</pre><p>
+Export complete libcaptive modules to reactos. It is done by *.def files used
+by dlltool(1) of Mingw32 compiler suite. We use native host OS compiler and
+we also have just a limited set of functions over reactos itself.
+We use our <a href="captive-apiref-ldr-exports.html#captive-ModuleList-add-builtin">captive_ModuleList_add_builtin</a>() to simulate PE headers exporting
+our symbols; this export simulation is invocated from this function.
+</p><p>
+This function is generated automatically from exports.captivesym file
+by captivesym.pl script.
+</p><p>
+Multiple calls of this function are forbidden. See also <a href="captive-apiref-ldr-exports.html#captive-kernel-patches">captive_kernel_patches</a>().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the export was successful.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-kernel-patches"></a>captive_kernel_patches ()</h3><pre class="programlisting">gboolean captive_kernel_patches (void);</pre><p>
+Patches W32 libraries by libcaptive functions. It is done by *.def files used
+by dlltool(1) of Mingw32 compiler suite. We use native host OS compiler and
+we also have just a limited set of functions over reactos itself.
+We use our <a href="captive-apiref-ldr-exports.html#captive-ModuleList-patch">captive_ModuleList_patch</a>() to modify existing module function
+tables generated from <a href="captive-apiref-ldr-exports.html#captive-ModuleList-add-builtin">captive_ModuleList_add_builtin</a>().
+</p><p>
+This function is generated automatically from exports.captivesym file
+by captivesym.pl script.
+</p><p>
+Multiple calls of this function are forbidden. See also <a href="captive-apiref-ldr-exports.html#captive-kernel-exports">captive_kernel_exports</a>().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the export was successful.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ModuleList-add-builtin"></a>captive_ModuleList_add_builtin ()</h3><pre class="programlisting">gboolean captive_ModuleList_add_builtin (const gchar *FullName_utf8,
+ ...);</pre><p>
+Adds simulated built-in module to ModuleListHead module list.
+It can be used for the functionality of reactos/ntoskrnl/ldr/loader.c/LdrInitModuleManagement().
+libcaptive does not support Ordinals - we just pretend liner (<tt>0</tt>-based)
+Ordinal numbers of the functions in given @... stdargs order.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>FullName_utf8</tt></i>Â :</span></td><td> String to fill in PMODULE_OBJECT->FullName.
+</td></tr><tr><td><span class="term"><i><tt>...</tt></i>Â :</span></td><td> (const gchar *sym_name,void *sym_val) symbol list terminated by <tt>NULL</tt>.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the module was successfuly added.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ModuleList-patch"></a>captive_ModuleList_patch ()</h3><pre class="programlisting">gboolean captive_ModuleList_patch (const gchar *FullName_utf8,
+ ...);</pre><p>
+Patches existing <i><tt>FullName_utf8</tt></i> module to use for function named sym_name
+pointer to the handler sym_val. If patchpoint is not <tt>NULL</tt> it gets assigned the original
+pointer value (used for <tt>pass</tt> keyword in exports.captivesym).
+</p><p>
+Put here 0xF4 'hlt' instead of 0xCC 'int $0x3; breakpoint'
+as 'hlt' will generate handled SIGSEGV instead of SIGTRAP which
+is used by gdb(1) during debugging.
+See also libcaptive/ps/signal.c/ sigaction_SIGSEGV().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>FullName_utf8</tt></i>Â :</span></td><td> String to find PMODULE_OBJECT by FullName.
+</td></tr><tr><td><span class="term"><i><tt>...</tt></i>Â :</span></td><td> (const gchar *sym_name,void (*sym_val)(void),struct captive_ModuleList_patchpoint *patchpoint) symbol list terminated by <tt>NULL</tt>.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the module was successfuly added.
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-storage.html"><b><< storage</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-calltype-reactos.html"><b>calltype_reactos >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>ldr</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-init.html" title="init"><link rel="next" href="captive-apiref-macros.html" title="macros"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-init.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-macros.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-ldr"></a><div class="titlepage"></div><div class="refnamediv"><h2>ldr</h2><p>ldr — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+NTSTATUS <a href="captive-apiref-ldr.html#captive-LdrpLoadAndCallImage">captive_LdrpLoadAndCallImage</a> (PMODULE_OBJECT *ModuleObjectp,
+ struct captive_options_module *options_module,
+ PDRIVER_OBJECT DriverEntry_DriverObject,
+ PUNICODE_STRING DriverEntry_RegistryPath);
+NTSTATUS <a href="captive-apiref-ldr.html#captive-LdrLoadModule">captive_LdrLoadModule</a> (struct captive_options_module *options_module,
+ PMODULE_OBJECT *ModuleObjectp);
+G_CONST_RETURN gchar* <a href="captive-apiref-ldr.html#captive-ModuleList-function-disable-find">captive_ModuleList_function_disable_find</a>
+ (gconstpointer ExportAddress);
+void* <a href="captive-apiref-ldr.html#captive-Module-GetExportAddress">captive_Module_GetExportAddress</a> (const gchar *ModuleName_utf8,
+ const gchar *FunctionName);
+void <a href="captive-apiref-ldr.html#captive-PoQueueShutdownWorkItem-hooklist-invoke">captive_PoQueueShutdownWorkItem_hooklist_invoke</a>
+ (void);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-LdrpLoadAndCallImage"></a>captive_LdrpLoadAndCallImage ()</h3><pre class="programlisting">NTSTATUS captive_LdrpLoadAndCallImage (PMODULE_OBJECT *ModuleObjectp,
+ struct captive_options_module *options_module,
+ PDRIVER_OBJECT DriverEntry_DriverObject,
+ PUNICODE_STRING DriverEntry_RegistryPath);</pre><p>
+Corresponds to reactos LdrpLoadAndCallImage() but it also provides arguments
+to pass to PDRIVER_INITIALIZE call of module driver initialization.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>ModuleObjectp</tt></i>Â :</span></td><td> Returns PMODULE_OBJECT successfuly loaded.
+</td></tr><tr><td><span class="term"><i><tt>options_module</tt></i>Â :</span></td><td> captive_options_module structure describing the module to load.
+Loading of already loaded module is forbidden despite original
+LdrpLoadAndCallImage().
+</td></tr><tr><td><span class="term"><i><tt>DriverEntry_DriverObject</tt></i>Â :</span></td><td> argument DriverObject of PDRIVER_INITIALIZE call.
+</td></tr><tr><td><span class="term"><i><tt>DriverEntry_RegistryPath</tt></i>Â :</span></td><td> argument RegistryPath of PDRIVER_INITIALIZE call.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> STATUS_SUCCESS if the driver module was loaded and initialized
+successfuly during this call. Ignore returned <i><tt>ModuleObjectp</tt></i> if function failed.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-LdrLoadModule"></a>captive_LdrLoadModule ()</h3><pre class="programlisting">NTSTATUS captive_LdrLoadModule (struct captive_options_module *options_module,
+ PMODULE_OBJECT *ModuleObjectp);</pre><p>
+Load and initialize module to reactos using host OS functions.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>options_module</tt></i>Â :</span></td><td> captive_options_module structure describing the module to load.
+Loading of already loaded module is forbidden.
+</td></tr><tr><td><span class="term"><i><tt>ModuleObjectp</tt></i>Â :</span></td><td> Returns initialized module object.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> STATUS_SUCCESS if the module was loaded successfuly during the call.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ModuleList-function-disable-find"></a>captive_ModuleList_function_disable_find ()</h3><pre class="programlisting">G_CONST_RETURN gchar* captive_ModuleList_function_disable_find
+ (gconstpointer ExportAddress);</pre><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>ExportAddress</tt></i>Â :</span></td><td>
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td>
+
+
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-Module-GetExportAddress"></a>captive_Module_GetExportAddress ()</h3><pre class="programlisting">void* captive_Module_GetExportAddress (const gchar *ModuleName_utf8,
+ const gchar *FunctionName);</pre><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>ModuleName_utf8</tt></i>Â :</span></td><td>
+</td></tr><tr><td><span class="term"><i><tt>FunctionName</tt></i>Â :</span></td><td>
+
+
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-PoQueueShutdownWorkItem-hooklist-invoke"></a>captive_PoQueueShutdownWorkItem_hooklist_invoke ()</h3><pre class="programlisting">void captive_PoQueueShutdownWorkItem_hooklist_invoke
+ (void);</pre><p>
+
+</p></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-init.html"><b><< init</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-macros.html"><b>macros >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>macros</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-ldr.html" title="ldr"><link rel="next" href="captive-apiref-mm.html" title="mm"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-ldr.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-mm.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-macros"></a><div class="titlepage"></div><div class="refnamediv"><h2>macros</h2><p>macros — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+#define <a href="captive-apiref-macros.html#CAPTIVE-FAKEUSE-CAPS">CAPTIVE_FAKEUSE</a>
+#define <a href="captive-apiref-macros.html#captive-newn">captive_newn</a> (objp,n)
+#define <a href="captive-apiref-macros.html#captive-new0n">captive_new0n</a> (objp,n)
+#define <a href="captive-apiref-macros.html#captive-renewn">captive_renewn</a> (objp,n)
+#define <a href="captive-apiref-macros.html#captive-new">captive_new</a> (objp)
+#define <a href="captive-apiref-macros.html#captive-new0">captive_new0</a> (objp)
+#define <a href="captive-apiref-macros.html#captive-newn-alloca">captive_newn_alloca</a> (objp,n)
+#define <a href="captive-apiref-macros.html#captive-new0n-alloca">captive_new0n_alloca</a> (objp,n)
+#define <a href="captive-apiref-macros.html#captive-new-alloca">captive_new_alloca</a> (objp)
+#define <a href="captive-apiref-macros.html#captive-new0-alloca">captive_new0_alloca</a> (objp)
+#define <a href="captive-apiref-macros.html#captive-memdup">captive_memdup</a> (destp,srcp)
+#define <a href="captive-apiref-macros.html#captive-va-arg">captive_va_arg</a> (objp,ap)
+#define <a href="captive-apiref-macros.html#CAPTIVE-MEMZERO-CAPS">CAPTIVE_MEMZERO</a> (objp)
+#define <a href="captive-apiref-macros.html#captive-printf-alloca">captive_printf_alloca</a> (format,args...)
+#define <a href="captive-apiref-macros.html#captive-strdup-alloca">captive_strdup_alloca</a> (string)
+#define <a href="captive-apiref-macros.html#CAPTIVE-ROUND-DOWN-CAPS">CAPTIVE_ROUND_DOWN</a> (pointer,fragment)
+#define <a href="captive-apiref-macros.html#CAPTIVE-ROUND-DOWN64-CAPS">CAPTIVE_ROUND_DOWN64</a> (pointer,fragment)
+#define <a href="captive-apiref-macros.html#CAPTIVE-ROUND-DOWN-EXCEEDING-CAPS">CAPTIVE_ROUND_DOWN_EXCEEDING</a> (pointer,fragment)
+#define <a href="captive-apiref-macros.html#CAPTIVE-ROUND-DOWN-EXCEEDING64-CAPS">CAPTIVE_ROUND_DOWN_EXCEEDING64</a> (pointer,fragment)
+#define <a href="captive-apiref-macros.html#CAPTIVE-ROUND-UP-CAPS">CAPTIVE_ROUND_UP</a> (pointer,fragment)
+#define <a href="captive-apiref-macros.html#CAPTIVE-ROUND-UP64-CAPS">CAPTIVE_ROUND_UP64</a> (pointer,fragment)
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="CAPTIVE-FAKEUSE-CAPS"></a>CAPTIVE_FAKEUSE</h3><pre class="programlisting">#define CAPTIVE_FAKEUSE =0
+</pre><p>
+Prevent 'might be used uninitialized' warning.
+Macro will fakes the use of the variable as sometimes GCC can't code flow
+analyse C correctly.
+</p><p>
+</p><div class="informalexample"><pre class="programlisting">
+g_some_type some_variable CAPTIVE_FAKEUSE;
+</pre></div><p>
+
+</p></div><hr><div class="refsect2" lang="en"><h3><a name="captive-newn"></a>captive_newn()</h3><pre class="programlisting">#define captive_newn(objp,n) ((objp)=g_new(typeof(*(objp)),(n)))
+</pre><p>
+Macro to allocate <i><tt>n</tt></i> objects of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory may contain garbage.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the memory of size sizeof(typeof(*objp))*n.
+Value <tt>NULL</tt> is returned iff <i><tt>n</tt></i>==<tt>0</tt>;</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the objects wished to be allocated.
+Original value is discarded.
+</td></tr><tr><td><span class="term"><i><tt>n</tt></i>Â :</span></td><td> Numbers of objects to be allocated. Value <tt>0</tt> is permitted (<tt>NULL</tt> assignment effect).
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-new0n"></a>captive_new0n()</h3><pre class="programlisting">#define captive_new0n(objp,n) ((objp)=g_new0(typeof(*(objp)),(n)))
+</pre><p>
+Macro to allocate <i><tt>n</tt></i> objects of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory is precleared.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the cleared memory of size sizeof(typeof(*objp))*n.
+Value <tt>NULL</tt> is returned iff <i><tt>n</tt></i>==<tt>0</tt>;</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the objects wished to be allocated and precleared.
+Original value is discarded.
+</td></tr><tr><td><span class="term"><i><tt>n</tt></i>Â :</span></td><td> Numbers of objects to be allocated. Value <tt>0</tt> is permitted (<tt>NULL</tt> assignment effect).
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-renewn"></a>captive_renewn()</h3><pre class="programlisting">#define captive_renewn(objp,n)</pre><p>
+Macro to reallocate the original memory stored in <i><tt>objp</tt></i>
+to the size <i><tt>n</tt></i> objects of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+New allocated space may contain garbage. Both <i><tt>objp</tt></i> and <i><tt>n</tt></i> can be nonexclusively
+passed as zero.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the memory of size sizeof(typeof(*objp))*n.
+Value <tt>NULL</tt> is returned iff <i><tt>n</tt></i>==<tt>0</tt>;</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the objects wished to be reallocated.
+Value <tt>NULL</tt> is permitted (g_malloc() effect).
+</td></tr><tr><td><span class="term"><i><tt>n</tt></i>Â :</span></td><td> Numbers of objects to be allocated. Value <tt>0</tt> is permitted (g_free() effect).
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-new"></a>captive_new()</h3><pre class="programlisting">#define captive_new(objp) (captive_newn((objp),1))
+</pre><p>
+Macro to allocate one object of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory may contain garbage. Equivalent to captive_newn(objp,1) call.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the memory of size sizeof(typeof(*objp)).
+Value <tt>NULL</tt> is never returned.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the object wished to be allocated.
+Original value is discarded.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-new0"></a>captive_new0()</h3><pre class="programlisting">#define captive_new0(objp) (captive_new0n((objp),1))
+</pre><p>
+Macro to allocate one object of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory is precleared. Equivalent to captive_new0n(objp,1) call.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the cleared memory of size sizeof(typeof(*objp)).
+Value <tt>NULL</tt> is never returned.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the object wished to be allocated and precleared.
+Original value is discarded.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-newn-alloca"></a>captive_newn_alloca()</h3><pre class="programlisting">#define captive_newn_alloca(objp,n)</pre><p>
+Macro to allocate <i><tt>n</tt></i> objects of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory may contain garbage.
+</p><p>
+Memory is allocated on the stack frame by g_alloca() and it will be automatically deallocated
+during exit of current function (or current block if variable sized variables present there).
+You cannot deallocate or reallocate such memory in any other way.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the memory of size sizeof(typeof(*objp))*n.
+Value <tt>NULL</tt> is returned iff <i><tt>n</tt></i>==<tt>0</tt>;</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the objects wished to be allocated.
+Original value is discarded.
+</td></tr><tr><td><span class="term"><i><tt>n</tt></i>Â :</span></td><td> Numbers of objects to be allocated. Value <tt>0</tt> is permitted (<tt>NULL</tt> assignment effect).
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-new0n-alloca"></a>captive_new0n_alloca()</h3><pre class="programlisting">#define captive_new0n_alloca(objp,n)</pre><p>
+Macro to allocate <i><tt>n</tt></i> objects of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory is precleared.
+</p><p>
+Memory is allocated on the stack frame by g_alloca() and it will be automatically deallocated
+during exit of current function (or current block if variable sized variables present there).
+You cannot deallocate or reallocate such memory in any other way.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the cleared memory of size sizeof(typeof(*objp))*n.
+Value <tt>NULL</tt> is returned iff <i><tt>n</tt></i>==<tt>0</tt>;</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the objects wished to be allocated and precleared.
+Original value is discarded.
+</td></tr><tr><td><span class="term"><i><tt>n</tt></i>Â :</span></td><td> Numbers of objects to be allocated. Value <tt>0</tt> is permitted (<tt>NULL</tt> assignment effect).
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-new-alloca"></a>captive_new_alloca()</h3><pre class="programlisting">#define captive_new_alloca(objp) (captive_newn_alloca((objp),1))
+</pre><p>
+Macro to allocate one object of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory may contain garbage. Equivalent to captive_newn_alloca(objp,1) call.
+</p><p>
+Memory is allocated on the stack frame by g_alloca() and it will be automatically deallocated
+during exit of current function (or current block if variable sized variables present there).
+You cannot deallocate or reallocate such memory in any other way.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the memory of size sizeof(typeof(*objp)).
+Value <tt>NULL</tt> is never returned.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the object wished to be allocated.
+Original value is discarded.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-new0-alloca"></a>captive_new0_alloca()</h3><pre class="programlisting">#define captive_new0_alloca(objp) (captive_new0n_alloca((objp),1))
+</pre><p>
+Macro to allocate one object of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory is precleared. Equivalent to captive_new0n_alloca(objp,1) call.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the cleared memory of size sizeof(typeof(*objp)).</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the object wished to be allocated and precleared.
+Original value is discarded.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-memdup"></a>captive_memdup()</h3><pre class="programlisting">#define captive_memdup(destp,srcp)</pre><p>
+Macro to similiar to g_memdup() but the object size is detected automatically.
+Size of <i><tt>destp</tt></i> object and <i><tt>srcp</tt></i> object must be the same.
+</p><p>
+You must free the allocated memory of <i><tt>destp</tt></i> by g_free().
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>destp</tt></i> value as the copied memory of size sizeof(typeof(*srcp)).</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>destp</tt></i>Â :</span></td><td> Variable with the pointer to the target object wished to be allocated.
+Original value is discarded.
+</td></tr><tr><td><span class="term"><i><tt>srcp</tt></i>Â :</span></td><td> Pointer to the source object to be copied to <i><tt>destp</tt></i>.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-va-arg"></a>captive_va_arg()</h3><pre class="programlisting">#define captive_va_arg(objp,ap) ((objp)=va_arg((ap),typeof(objp)))
+</pre><p>
+Automatically determines the size of <i><tt>objp</tt></i>.
+Equivalent to objp=va_arg(ap,typeof(objp)) call.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable to be filled from the next argument of <i><tt>ap</tt></i>.
+</td></tr><tr><td><span class="term"><i><tt>ap</tt></i>Â :</span></td><td> Initialized va_list type.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-MEMZERO-CAPS"></a>CAPTIVE_MEMZERO()</h3><pre class="programlisting">#define CAPTIVE_MEMZERO(objp) (memset((objp),0,sizeof(*(objp))))
+</pre><p>
+Clears the sizeof(*<i><tt>objp</tt></i>) bytes of the given pointer with memset().
+Pass _pointer_ to the object to be cleared.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Pointer to the variable to be cleared.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-printf-alloca"></a>captive_printf_alloca()</h3><pre class="programlisting">#define captive_printf_alloca(format,args...)</pre><p>
+Format the given format string <i><tt>format</tt></i> as in sprintf().
+Output buffer is allocated automatically and it does not need to be deallocated
+manually as it is managed by g_alloca().
+</p><p>
+<i><tt>Returns</tt></i>: Formatted output string located in g_alloca() memory.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>format</tt></i>Â :</span></td><td> Format string. See the sprintf() documentation.
+</td></tr><tr><td><span class="term"><i><tt>args...</tt></i>Â :</span></td><td> Arguments for <i><tt>format</tt></i>. See the sprintf() documentation.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-strdup-alloca"></a>captive_strdup_alloca()</h3><pre class="programlisting">#define captive_strdup_alloca(string)</pre><p>
+Macro to do g_strdup() equivalent in g_alloca() style.
+</p><p>
+Memory is allocated on the stack frame by g_alloca() and it will be automatically deallocated
+during exit of current function (or current block if variable sized variables present there).
+You cannot deallocate or reallocate such memory in any other way.
+</p><p>
+<i><tt>Returns</tt></i>: Duplicated <i><tt>string</tt></i>. You may modify its items if the length is not changed.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string</tt></i>Â :</span></td><td> const gchar * string to duplicate.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-ROUND-DOWN-CAPS"></a>CAPTIVE_ROUND_DOWN()</h3><pre class="programlisting">#define CAPTIVE_ROUND_DOWN(pointer,fragment)</pre><p>
+General pointer down-rounding macro. Already aligned pointer is left as is.
+</p><p>
+glib NOTE: YOU MAY NOT STORE POINTERS IN INTEGERS.
+</p><p>
+<i><tt>Returns</tt></i>: Down-rounded <i><tt>pointer</tt></i> to the integer multiple of <i><tt>fragment</tt></i>.
+Resulting pointer has the same type as <i><tt>pointer</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>pointer</tt></i>Â :</span></td><td> Arbitrary pointer type.
+</td></tr><tr><td><span class="term"><i><tt>fragment</tt></i>Â :</span></td><td> Amount of 'sizeof(char)' to align <i><tt>pointer</tt></i> down to.
+This size will be typically a power of 2.
+Value less or equal to <tt>0</tt> is forbidden.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-ROUND-DOWN64-CAPS"></a>CAPTIVE_ROUND_DOWN64()</h3><pre class="programlisting">#define CAPTIVE_ROUND_DOWN64(pointer,fragment)</pre><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>pointer</tt></i>Â :</span></td><td>
+</td></tr><tr><td><span class="term"><i><tt>fragment</tt></i>Â :</span></td><td>
+
+
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-ROUND-DOWN-EXCEEDING-CAPS"></a>CAPTIVE_ROUND_DOWN_EXCEEDING()</h3><pre class="programlisting">#define CAPTIVE_ROUND_DOWN_EXCEEDING(pointer,fragment)</pre><p>
+Detects current non-aligned amount of data exceeding over integer multiple of <i><tt>fragment</tt></i>.
+It will return value <tt>0</tt> for an aligned pointer.
+</p><p>
+glib NOTE: YOU MAY NOT STORE POINTERS IN INTEGERS.
+</p><p>
+<i><tt>Returns</tt></i>: gsize typed number of bytes exceeding over integer multiple of <i><tt>fragment</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>pointer</tt></i>Â :</span></td><td> Arbitrary pointer type.
+</td></tr><tr><td><span class="term"><i><tt>fragment</tt></i>Â :</span></td><td> Amount of 'sizeof(char)' to detect down-alignment amount of <i><tt>pointer</tt></i> for.
+This size will be typically a power of 2.
+Value less or equal to <tt>0</tt> is forbidden.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-ROUND-DOWN-EXCEEDING64-CAPS"></a>CAPTIVE_ROUND_DOWN_EXCEEDING64()</h3><pre class="programlisting">#define CAPTIVE_ROUND_DOWN_EXCEEDING64(pointer,fragment)</pre><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>pointer</tt></i>Â :</span></td><td>
+</td></tr><tr><td><span class="term"><i><tt>fragment</tt></i>Â :</span></td><td>
+
+
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-ROUND-UP-CAPS"></a>CAPTIVE_ROUND_UP()</h3><pre class="programlisting">#define CAPTIVE_ROUND_UP(pointer,fragment)</pre><p>
+General pointer up-rounding macro. Already aligned pointer is left as is.
+</p><p>
+glib NOTE: YOU MAY NOT STORE POINTERS IN INTEGERS.
+</p><p>
+<i><tt>Returns</tt></i>: Up-rounded <i><tt>pointer</tt></i> to the integer multiple of <i><tt>fragment</tt></i>.
+Resulting pointer has the same type as <i><tt>pointer</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>pointer</tt></i>Â :</span></td><td> Arbitrary pointer type.
+</td></tr><tr><td><span class="term"><i><tt>fragment</tt></i>Â :</span></td><td> Amount of 'sizeof(char)' to align <i><tt>pointer</tt></i> up to.
+This size will be typically a power of 2.
+Value less or equal to <tt>0</tt> is forbidden.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-ROUND-UP64-CAPS"></a>CAPTIVE_ROUND_UP64()</h3><pre class="programlisting">#define CAPTIVE_ROUND_UP64(pointer,fragment)</pre><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>pointer</tt></i>Â :</span></td><td>
+</td></tr><tr><td><span class="term"><i><tt>fragment</tt></i>Â :</span></td><td>
+
+
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-ldr.html"><b><< ldr</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-mm.html"><b>mm >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>mm</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-macros.html" title="macros"><link rel="next" href="captive-apiref-ps-reactos.html" title="ps_reactos"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-macros.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-ps-reactos.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-mm"></a><div class="titlepage"></div><div class="refnamediv"><h2>mm</h2><p>mm — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+gint <a href="captive-apiref-mm.html#captive-flProtect-to-mmap-prot">captive_flProtect_to_mmap_prot</a> (ULONG flProtect);
+gboolean <a href="captive-apiref-mm.html#captive-mmap-map-new">captive_mmap_map_new</a> (gconstpointer addr,
+ size_t len,
+ int mmap_prot);
+gint <a href="captive-apiref-mm.html#captive-mmap-map-get">captive_mmap_map_get</a> (gconstpointer addr);
+gboolean <a href="captive-apiref-mm.html#captive-mmap-map-set">captive_mmap_map_set</a> (gconstpointer addr,
+ int mmap_prot);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-flProtect-to-mmap-prot"></a>captive_flProtect_to_mmap_prot ()</h3><pre class="programlisting">gint captive_flProtect_to_mmap_prot (ULONG flProtect);</pre><p>
+Map reactos flProtect to mprotect(2)-compatible "prot" argument.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>flProtect</tt></i>Â :</span></td><td> reactos compatible constant such as <tt>PAGE_READWRITE</tt>.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> mmap(2) compatible <i><tt>prot</tt></i> argument.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-mmap-map-new"></a>captive_mmap_map_new ()</h3><pre class="programlisting">gboolean captive_mmap_map_new (gconstpointer addr,
+ size_t len,
+ int mmap_prot);</pre><p>
+Initialize the protection map for the specified memory block.
+Any existing protections in the specified block are forbidden.
+</p><p>
+This function does not do any mprotect(2) style, it just stores
+the settings for the later <tt>OR</tt> operations by MmSetPageProtect().
+Caller is responsibel to set the same protections as the given <i><tt>mmap_prot</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>addr</tt></i>Â :</span></td><td> <tt>PAGE_SIZE</tt> aligned address of memory block.
+<tt>NULL</tt> value is forbidden.
+</td></tr><tr><td><span class="term"><i><tt>len</tt></i>Â :</span></td><td> <tt>PAGE_SIZE</tt> aligned length of memory block.
+Value <tt>0</tt> is permitted. Value <tt>-1</tt> is forbidden.
+</td></tr><tr><td><span class="term"><i><tt>mmap_prot</tt></i>Â :</span></td><td> Protections for the memory block as specified by <i><tt>prot</tt></i> of mprotect(2).
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the protection storage was successful.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-mmap-map-get"></a>captive_mmap_map_get ()</h3><pre class="programlisting">gint captive_mmap_map_get (gconstpointer addr);</pre><p>
+Query the protection settings at <i><tt>addr</tt></i> address.
+The given <i><tt>addr</tt></i> block of <tt>PAGE_SIZE</tt> must be already initialized
+by <a href="captive-apiref-mm.html#captive-mmap-map-new">captive_mmap_map_new</a>().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>addr</tt></i>Â :</span></td><td> <tt>PAGE_SIZE</tt> aligned address of memory block.
+<tt>NULL</tt> value is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> Protections of the page as specified by <i><tt>prot</tt></i> of mprotect(2)
+if successful. Value <tt>-1</tt> if failed.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-mmap-map-set"></a>captive_mmap_map_set ()</h3><pre class="programlisting">gboolean captive_mmap_map_set (gconstpointer addr,
+ int mmap_prot);</pre><p>
+Set the protection settings at <i><tt>addr</tt></i> address.
+The given <i><tt>addr</tt></i> block of <tt>PAGE_SIZE</tt> must be already initialized
+by <a href="captive-apiref-mm.html#captive-mmap-map-new">captive_mmap_map_new</a>().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>addr</tt></i>Â :</span></td><td> <tt>PAGE_SIZE</tt> aligned address of memory block.
+<tt>NULL</tt> value is forbidden.
+</td></tr><tr><td><span class="term"><i><tt>mmap_prot</tt></i>Â :</span></td><td> Protections for the memory block as specified by <i><tt>prot</tt></i> of mprotect(2).
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the protections were successfuly set.
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-macros.html"><b><< macros</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-ps-reactos.html"><b>ps_reactos >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>ps_reactos</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-mm.html" title="mm"><link rel="next" href="captive-apiref-unicode.html" title="unicode"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-mm.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-unicode.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-ps-reactos"></a><div class="titlepage"></div><div class="refnamediv"><h2>ps_reactos</h2><p>ps_reactos — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+typedef <a href="captive-apiref-ps-reactos.html#captive-KPCR">captive_KPCR</a>;
+typedef <a href="captive-apiref-ps-reactos.html#captive-PKPCR">captive_PKPCR</a>;
+<a href="captive-apiref-ps-reactos.html#captive-PKPCR">captive_PKPCR</a> <a href="captive-apiref-ps-reactos.html#captive-KeGetCurrentKPCR">captive_KeGetCurrentKPCR</a> (void);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-KPCR"></a>captive_KPCR</h3><pre class="programlisting">typedef struct {
+ struct
+ /* newline to pass gtkdoc-scan */
+ _KTHREAD *CurrentThread;
+ } captive_KPCR;
+</pre><p>
+PCR (Processor Control Region) structure type.
+Returned by <a href="captive-apiref-ps-reactos.html#captive-KeGetCurrentKPCR">captive_KeGetCurrentKPCR</a>().
+</p><p>
+This structure IS NOT binary compatible with reactos!</p><p>
+
+</p></div><hr><div class="refsect2" lang="en"><h3><a name="captive-PKPCR"></a>captive_PKPCR</h3><pre class="programlisting">typedef captive_KPCR *captive_PKPCR;
+</pre><p>
+
+</p></div><hr><div class="refsect2" lang="en"><h3><a name="captive-KeGetCurrentKPCR"></a>captive_KeGetCurrentKPCR ()</h3><pre class="programlisting"><a href="captive-apiref-ps-reactos.html#captive-PKPCR">captive_PKPCR</a> captive_KeGetCurrentKPCR (void);</pre><p>
+Returns the PCR (Processor Control Region) structure for the
+current CPU.
+Currently libcaptive doesn't use multithreading
+and thus this function returns a constant pointer to one static structure.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <a href="captive-apiref-ps-reactos.html#captive-PKPCR">captive_PKPCR</a> type pointer to valid <a href="captive-apiref-ps-reactos.html#captive-KPCR">captive_KPCR</a>.
+This structure IS NOT binary compatible with reactos - you SHOULD NOT
+export this symbol for binary W32 modules. Anyone using this function
+is very low-level based and you would probably find many other
+compatibility problems afterwards - replace of such function is recommended.
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-mm.html"><b><< mm</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-unicode.html"><b>unicode >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>rtl-file</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-signal.html" title="signal"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-signal.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th></tr></table><div class="refentry" lang="en"><a name="captive-apiref-rtl-file"></a><div class="titlepage"></div><div class="refnamediv"><h2>rtl-file</h2><p>rtl-file — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+gpointer <a href="captive-apiref-rtl-file.html#captive-rtl-file-mmap">captive_rtl_file_mmap</a> (size_t *lenp,
+ const gchar *path,
+ int open_flags,
+ int mmap_prot,
+ int mmap_flags);
+void <a href="captive-apiref-rtl-file.html#captive-rtl-file-munmap">captive_rtl_file_munmap</a> (gpointer base);
+gpointer <a href="captive-apiref-rtl-file.html#captive-rtl-file-read">captive_rtl_file_read</a> (gint fd,
+ gsize *bufsizep);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-rtl-file-mmap"></a>captive_rtl_file_mmap ()</h3><pre class="programlisting">gpointer captive_rtl_file_mmap (size_t *lenp,
+ const gchar *path,
+ int open_flags,
+ int mmap_prot,
+ int mmap_flags);</pre><p>
+mmap(2) the whole file into memory.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>lenp</tt></i>Â :</span></td><td> returns the file length if successful. <tt>NULL</tt> pointer permitted.
+</td></tr><tr><td><span class="term"><i><tt>path</tt></i>Â :</span></td><td> File pathname to open(2).
+</td></tr><tr><td><span class="term"><i><tt>open_flags</tt></i>Â :</span></td><td> open(2) parameter flags such as <tt>O_RDONLY</tt>.
+</td></tr><tr><td><span class="term"><i><tt>mmap_prot</tt></i>Â :</span></td><td> mmap(2) parameter prot such as <tt>PROT_READ</tt>.
+</td></tr><tr><td><span class="term"><i><tt>mmap_flags</tt></i>Â :</span></td><td> mmap(2) parameter flags such as <tt>MAP_SHARED</tt>.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> address base with mmap(2)ed file (and <i><tt>lenp</tt></i> filled) or NULL if error.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-rtl-file-munmap"></a>captive_rtl_file_munmap ()</h3><pre class="programlisting">void captive_rtl_file_munmap (gpointer base);</pre><p>
+munmap(2) the whole file and destroy all its resources.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>base</tt></i>Â :</span></td><td> file base address returned by <a href="captive-apiref-rtl-file.html#captive-rtl-file-mmap">captive_rtl_file_mmap</a>(). <tt>NULL</tt> pointer forbidden.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-rtl-file-read"></a>captive_rtl_file_read ()</h3><pre class="programlisting">gpointer captive_rtl_file_read (gint fd,
+ gsize *bufsizep);</pre><p>
+Reads the whole file into memory.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>fd</tt></i>Â :</span></td><td> file-descriptor to read data from.
+</td></tr><tr><td><span class="term"><i><tt>bufsizep</tt></i>Â :</span></td><td> Returns the size of resulting data.
+<tt>NULL</tt> pointer is permitted.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> address base of the memory being filled with file contents.
+Free the area by g_free() if no longer used.
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-signal.html"><b><<Â signal</b></a></td><td align="right"></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>signal</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-calltype-reactos.html" title="calltype_reactos"><link rel="next" href="captive-apiref-rtl-file.html" title="rtl-file"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-calltype-reactos.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-rtl-file.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-signal"></a><div class="titlepage"></div><div class="refnamediv"><h2>signal</h2><p>signal — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+gboolean <a href="captive-apiref-signal.html#captive-signal-init">captive_signal_init</a> (void);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-signal-init"></a>captive_signal_init ()</h3><pre class="programlisting">gboolean captive_signal_init (void);</pre><p>
+Initialize UNIX signal handling to be able to emulate foreign W32
+instructions. These instructions must be located inside address
+space of foreign W32 binary code which is identified by successful
+call to <a href="captive-apiref-mm.html#captive-mmap-map-get">captive_mmap_map_get</a>() returning PROT_EXEC bit set.
+This bit should be set from MmAllocateSection() called from
+ntoskrnl/ldr/loader.c/LdrPEProcessModule().
+</p><p>
+Currently emulated set is the access to <tt>fs</tt> register offset <tt>0</tt>
+where the exception stack top pointer is located.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if successful.
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-calltype-reactos.html"><b><< calltype_reactos</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-rtl-file.html"><b>rtl-file >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>storage</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-unicode-reactos.html" title="unicode_reactos"><link rel="next" href="captive-apiref-ldr-exports.html" title="ldr_exports"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-unicode-reactos.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-ldr-exports.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-storage"></a><div class="titlepage"></div><div class="refnamediv"><h2>storage</h2><p>storage — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+extern GIOChannel *<a href="captive-apiref-storage.html#captive-image-iochannel">captive_image_iochannel</a>;
+extern guint64 <a href="captive-apiref-storage.html#captive-image-size">captive_image_size</a>;
+guint64 <a href="captive-apiref-storage.html#captive-giochannel-size">captive_giochannel_size</a> (GIOChannel *channel);
+gboolean <a href="captive-apiref-storage.html#captive-cdrom-init">captive_cdrom_init</a> (void);
+gboolean <a href="captive-apiref-storage.html#captive-disk-init">captive_disk_init</a> (void);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-image-iochannel"></a>captive_image_iochannel</h3><pre class="programlisting">extern GIOChannel *captive_image_iochannel;
+</pre><p>
+The readl GIOChannel to be used for accessing the disk image.
+It may be either directly captive_options->image_iochannel
+or the wrapper by giochannel-blind.</p><p>
+
+</p></div><hr><div class="refsect2" lang="en"><h3><a name="captive-image-size"></a>captive_image_size</h3><pre class="programlisting">extern guint64 captive_image_size;
+</pre><p>
+Size of <a href="captive-apiref-storage.html#captive-image-iochannel">captive_image_iochannel</a>. Empty files are rejected and therefore
+this value is always >0 after successful <a href="captive-apiref-init.html#captive-init">captive_init</a>().
+Value is detected by captive_giochannel_size(captive_image_iochannel).</p><p>
+
+</p></div><hr><div class="refsect2" lang="en"><h3><a name="captive-giochannel-size"></a>captive_giochannel_size ()</h3><pre class="programlisting">guint64 captive_giochannel_size (GIOChannel *channel);</pre><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>channel</tt></i>Â :</span></td><td>
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td>
+
+
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-cdrom-init"></a>captive_cdrom_init ()</h3><pre class="programlisting">gboolean captive_cdrom_init (void);</pre><p>
+Creates system device "\Device\CdRom<tt>d</tt>" providing readonly access
+to the given <a href="captive-apiref-storage.html#captive-image-iochannel">captive_image_iochannel</a> as emulation of CD-ROM driver.
+</p><p>
+libcaptive currently supports just one drive and thus "\Device\CdRom0"
+is always created. It is forbidden to call this function twice.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the initialization was successful.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-disk-init"></a>captive_disk_init ()</h3><pre class="programlisting">gboolean captive_disk_init (void);</pre><p>
+Creates system device "\Device\CaptiveHarddisk<tt>d</tt>" providing readwrite access
+to the given <a href="captive-apiref-storage.html#captive-image-iochannel">captive_image_iochannel</a> as emulation of harddisk driver.
+reactos initializes "\Device\Harddisk<tt>d</tt>\Partition0" as the whole disk
+and each partition it founds by IoReadPartitionTable() it will create
+as "\Device\Harddisk<tt>d</tt>\Partition1", "\Device\Harddisk<tt>d</tt>\Partition2" etc.
+</p><p>
+libcaptive does not (yet?) support any partitions and it will always create
+just the disk device for the whole given <a href="captive-apiref-storage.html#captive-image-iochannel">captive_image_iochannel</a>.
+As this behaviour is a bit specific we rather create some non-standard name
+of the device; anyway I have seen some "\Device\Harddisk<tt>dVolume</tt><tt>d</tt>" on W32
+system.
+</p><p>
+captive currently supports just one drive and thus "\Device\CaptiveHarddisk0"
+is always created. It is forbidden to call this function twice.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the initialization was successful.
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-unicode-reactos.html"><b><< unicode_reactos</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-ldr-exports.html"><b>ldr_exports >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>unicode_reactos</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-unicode.html" title="unicode"><link rel="next" href="captive-apiref-storage.html" title="storage"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-unicode.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-storage.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-unicode-reactos"></a><div class="titlepage"></div><div class="refnamediv"><h2>unicode_reactos</h2><p>unicode_reactos — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+typedef <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a>;
+const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a>* <a href="captive-apiref-unicode-reactos.html#captive-ucs4-to-ucs2-const">captive_ucs4_to_ucs2_const</a>
+ (const gunichar *string_ucs4);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-ucs2"></a>captive_ucs2</h3><pre class="programlisting">typedef guint16 captive_ucs2;
+</pre><p>
+This type is separated from Gnome gunichar2 as <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> MUST be used for UCS-2
+encoded strings in the opposite of gunichar2 beging used for UTF-16 encoded strings.</p><p>
+
+</p></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ucs4-to-ucs2-const"></a>captive_ucs4_to_ucs2_const ()</h3><pre class="programlisting">const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a>* captive_ucs4_to_ucs2_const
+ (const gunichar *string_ucs4);</pre><p>
+Constant string conversion from 32-bit wchar_t to 16-bit wchar_t.
+You may not modify the result in any way.
+</p><p>
+It is guaranteed to get two different string addresses for two different
+input addresses even if the input strings content is the same.
+Otherwise we would behave as GCC option <tt>-fmerge</tt>-constants which
+results in <tt>C</tt> non-conforming behaviour.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_ucs4</tt></i>Â :</span></td><td> const gunichar * type of persistent string to convert.
+This string MUST remain readable with the same content forever.
+This string MUST be convertible to UCS-2 string.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> * converted string <i><tt>string_ucs4</tt></i>.
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-unicode.html"><b><< unicode</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-storage.html"><b>storage >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>unicode</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-ps-reactos.html" title="ps_reactos"><link rel="next" href="captive-apiref-unicode-reactos.html" title="unicode_reactos"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-ps-reactos.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-unicode-reactos.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-unicode"></a><div class="titlepage"></div><div class="refnamediv"><h2>unicode</h2><p>unicode — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+#define <a href="captive-apiref-unicode.html#captive-UnicodeString-to-utf8-alloca">captive_UnicodeString_to_utf8_alloca</a>(string_UnicodeString)
+#define <a href="captive-apiref-unicode.html#captive-utf8-to-UnicodeString-alloca">captive_utf8_to_UnicodeString_alloca</a>(string_utf8)
+gboolean <a href="captive-apiref-unicode.html#captive-validate-ucs4">captive_validate_ucs4</a> (const gunichar *string_ucs4);
+gboolean <a href="captive-apiref-unicode.html#captive-validate-ucs2">captive_validate_ucs2</a> (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_ucs2);
+gboolean <a href="captive-apiref-unicode.html#captive-validate-ucs2-fixlen">captive_validate_ucs2_fixlen</a> (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_ucs2,
+ glong string_ucs2_fixlen);
+gboolean <a href="captive-apiref-unicode.html#captive-validate-utf8">captive_validate_utf8</a> (const gchar *string_utf8);
+glong <a href="captive-apiref-unicode.html#captive-ucs2-strlen">captive_ucs2_strlen</a> (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_ucs2);
+gboolean <a href="captive-apiref-unicode.html#captive-validate-UnicodeString">captive_validate_UnicodeString</a> (const UNICODE_STRING *string_UnicodeString);
+gboolean <a href="captive-apiref-unicode.html#captive-validate-UnicodeString-noterm">captive_validate_UnicodeString_noterm</a>
+ (const UNICODE_STRING *string_UnicodeString_noterm);
+gboolean <a href="captive-apiref-unicode.html#captive-validate-AnsiString">captive_validate_AnsiString</a> (const ANSI_STRING *string_AnsiString);
+gchar* <a href="captive-apiref-unicode.html#captive-UnicodeString-to-utf8-malloc">captive_UnicodeString_to_utf8_malloc</a>
+ (const UNICODE_STRING *string_UnicodeString);
+PUNICODE_STRING <a href="captive-apiref-unicode.html#captive-utf8-to-UnicodeString-malloc">captive_utf8_to_UnicodeString_malloc</a>
+ (const gchar *string_utf8);
+const gunichar2* <a href="captive-apiref-unicode.html#captive-ucs4-to-utf16-const">captive_ucs4_to_utf16_const</a>
+ (const gunichar *string_ucs4);
+gboolean <a href="captive-apiref-unicode.html#captive-ucs2-compare">captive_ucs2_compare</a> (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_a_ucs2,
+ const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_b_ucs2);
+gboolean <a href="captive-apiref-unicode.html#captive-UnicodeString-compare">captive_UnicodeString_compare</a> (const UNICODE_STRING *string_a_UnicodeString,
+ const UNICODE_STRING *string_b_UnicodeString);
+gboolean <a href="captive-apiref-unicode.html#captive-ucs2-compare-insensitive">captive_ucs2_compare_insensitive</a>
+ (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_a_ucs2,
+ const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_b_ucs2);
+gboolean <a href="captive-apiref-unicode.html#captive-UnicodeString-compare-insensitive">captive_UnicodeString_compare_insensitive</a>
+ (const UNICODE_STRING *string_a_UnicodeString,
+ const UNICODE_STRING *string_b_UnicodeString);
+void <a href="captive-apiref-unicode.html#captive-FsRtlLegalAnsiCharacterArray-init">captive_FsRtlLegalAnsiCharacterArray_init</a>
+ (void);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-UnicodeString-to-utf8-alloca"></a>captive_UnicodeString_to_utf8_alloca()</h3><pre class="programlisting">#define captive_UnicodeString_to_utf8_alloca(string_UnicodeString)</pre><p>
+alloca(3)-based conversion from PUNICODE_STRING to plain utf8 string.
+</p><p>
+<i><tt>Returns</tt></i>: const gchar * alloca(3)ed converted string <i><tt>string_UnicodeString</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_UnicodeString</tt></i>Â :</span></td><td> PUNICODE_STRING type of string to convert.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-utf8-to-UnicodeString-alloca"></a>captive_utf8_to_UnicodeString_alloca()</h3><pre class="programlisting">#define captive_utf8_to_UnicodeString_alloca(string_utf8)</pre><p>
+alloca(3)-based conversion from plain utf8 string to PUNICODE_STRING.
+</p><p>
+<i><tt>Returns</tt></i>: PUNICODE_STRING alloca(3)ed converted string <i><tt>string_utf8</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_utf8</tt></i>Â :</span></td><td> const gchar * string in utf8 to convert.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-validate-ucs4"></a>captive_validate_ucs4 ()</h3><pre class="programlisting">gboolean captive_validate_ucs4 (const gunichar *string_ucs4);</pre><p>
+Checks the validity of all 32-bit unicharacters of 0-terminated string.
+It is required to have characters complying to g_unichar_validate().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_ucs4</tt></i>Â :</span></td><td> const gunichar * type string to validate.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the string is valid.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-validate-ucs2"></a>captive_validate_ucs2 ()</h3><pre class="programlisting">gboolean captive_validate_ucs2 (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_ucs2);</pre><p>
+Checks the validity of all 16-bit unicharacters of 0-terminated string.
+It is required to have characters complying to g_unichar_validate().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_ucs2</tt></i>Â :</span></td><td> const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> * type string to validate.
+Invalid string input is forbidden.
+UTF-16 encoded strings are forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the string is valid.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-validate-ucs2-fixlen"></a>captive_validate_ucs2_fixlen ()</h3><pre class="programlisting">gboolean captive_validate_ucs2_fixlen (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_ucs2,
+ glong string_ucs2_fixlen);</pre><p>
+Checks the validity of first <i><tt>string_ucs2_fixlen</tt></i> 16-bit unicharacters of <i><tt>string_ucs2</tt></i>.
+It is required to have characters complying to g_unichar_validate().
+String length must be equal or larger than <i><tt>string_ucs2_fixlen</tt></i>;</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_ucs2</tt></i>Â :</span></td><td> const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> * type string to validate.
+Invalid string input is forbidden.
+UTF-16 encoded strings are forbidden.
+</td></tr><tr><td><span class="term"><i><tt>string_ucs2_fixlen</tt></i>Â :</span></td><td> Number of characters from <i><tt>string_ucs2</tt></i> to check.
+captive_ucs2_strlen(<i><tt>string_ucs2</tt></i>)>=<i><tt>string_ucs2_fixlen</tt></i> is required.
+Negative value is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the string is valid.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-validate-utf8"></a>captive_validate_utf8 ()</h3><pre class="programlisting">gboolean captive_validate_utf8 (const gchar *string_utf8);</pre><p>
+Checks the validity of all utf8 of 0-terminated string.
+It is required to have characters complying to g_utf8_validate().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_utf8</tt></i>Â :</span></td><td> const gchar * utf8 type string to validate.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the string is valid.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ucs2-strlen"></a>captive_ucs2_strlen ()</h3><pre class="programlisting">glong captive_ucs2_strlen (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_ucs2);</pre><p>
+Counts the number of characters (=2bytes) in <i><tt>strings_ucs2</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_ucs2</tt></i>Â :</span></td><td> String of type const gunichar2 * in pure UCS-2
+Invalid string input is forbidden. UTF-16 encoded pairs are forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <i><tt>string_ucs2</tt></i> length in UCS-2 characters.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-validate-UnicodeString"></a>captive_validate_UnicodeString ()</h3><pre class="programlisting">gboolean captive_validate_UnicodeString (const UNICODE_STRING *string_UnicodeString);</pre><p>
+Checks the internal consistency of the given <i><tt>string_UnicodeString</tt></i>.
+It is required to have characters complying to g_unichar_validate().
+<i><tt>string_UnicodeString</tt></i> MUST be zero-terminated.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_UnicodeString</tt></i>Â :</span></td><td> PUNICODE_STRING type string to validate.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the string is valid.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-validate-UnicodeString-noterm"></a>captive_validate_UnicodeString_noterm ()</h3><pre class="programlisting">gboolean captive_validate_UnicodeString_noterm
+ (const UNICODE_STRING *string_UnicodeString_noterm);</pre><p>
+Checks the internal consistency of the given <i><tt>string_UnicodeString</tt></i>.
+It is required to have characters complying to g_unichar_validate().
+<i><tt>string_UnicodeString_noterm</tt></i> does not neet to be zero-terminated.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_UnicodeString_noterm</tt></i>Â :</span></td><td> PUNICODE_STRING type string to validate.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the string is valid.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-validate-AnsiString"></a>captive_validate_AnsiString ()</h3><pre class="programlisting">gboolean captive_validate_AnsiString (const ANSI_STRING *string_AnsiString);</pre><p>
+Checks the internal consistency of the given <i><tt>string_AnsiString</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_AnsiString</tt></i>Â :</span></td><td> PANSI_STRING type string to validate.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the string is valid.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-UnicodeString-to-utf8-malloc"></a>captive_UnicodeString_to_utf8_malloc ()</h3><pre class="programlisting">gchar* captive_UnicodeString_to_utf8_malloc
+ (const UNICODE_STRING *string_UnicodeString);</pre><p>
+g_malloc()-based conversion from PUNICODE_STRING to plain utf8 string.
+You must free the result with g_free() function.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_UnicodeString</tt></i>Â :</span></td><td> PUNICODE_STRING type of string to convert.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> const gchar * g_malloc()ed converted string <i><tt>string_UnicodeString</tt></i>.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-utf8-to-UnicodeString-malloc"></a>captive_utf8_to_UnicodeString_malloc ()</h3><pre class="programlisting">PUNICODE_STRING captive_utf8_to_UnicodeString_malloc
+ (const gchar *string_utf8);</pre><p>
+g_malloc()-based conversion from plain utf8 string to PUNICODE_STRING.
+You must free the result with g_free() function.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_utf8</tt></i>Â :</span></td><td> const gchar * string in utf8 to convert.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> PUNICODE_STRING g_malloc()ed converted string <i><tt>string_utf8</tt></i>.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ucs4-to-utf16-const"></a>captive_ucs4_to_utf16_const ()</h3><pre class="programlisting">const gunichar2* captive_ucs4_to_utf16_const
+ (const gunichar *string_ucs4);</pre><p>
+Constant string conversion from 32-bit wchar_t to 16-bit (possible pairs of) UTF-16.
+You may not modify the result in any way.
+</p><p>
+It is guaranteed to get two different string addresses for two different
+input addresses even if the input strings content is the same.
+Otherwise we would behave as GCC option <tt>-fmerge</tt>-constants which
+results in <tt>C</tt> non-conforming behaviour.
+</p><p>
+FIXME: UTF-16 encoding IS NOT IMPLEMENTED.
+</p><p>
+See also <a href="captive-apiref-unicode-reactos.html#captive-ucs4-to-ucs2-const">captive_ucs4_to_ucs2_const</a>().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_ucs4</tt></i>Â :</span></td><td> const gunichar * type of persistent string to convert.
+This string MUST remain readable with the same content forever.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> const gunichar2 * converted string <i><tt>string_ucs4</tt></i>.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ucs2-compare"></a>captive_ucs2_compare ()</h3><pre class="programlisting">gboolean captive_ucs2_compare (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_a_ucs2,
+ const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_b_ucs2);</pre><p>
+Compares case-sensitively <i><tt>string_a_ucs2</tt></i> and <i><tt>string_b_ucs2</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_a_ucs2</tt></i>Â :</span></td><td> First string of type const gunichar2 * in pure UCS-2.
+Invalid string input is forbidden. UTF-16 encoded pairs are forbidden.
+</td></tr><tr><td><span class="term"><i><tt>string_b_ucs2</tt></i>Â :</span></td><td> Second string of type const gunichar2 * in pure UCS-2.
+Invalid string input is forbidden. UTF-16 encoded pairs are forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if <i><tt>string_a_ucs2</tt></i> and <i><tt>string_b_ucs2</tt></i> are the same.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-UnicodeString-compare"></a>captive_UnicodeString_compare ()</h3><pre class="programlisting">gboolean captive_UnicodeString_compare (const UNICODE_STRING *string_a_UnicodeString,
+ const UNICODE_STRING *string_b_UnicodeString);</pre><p>
+Compares case-sensitively <i><tt>string_a_UnicodeString</tt></i> and <i><tt>string_b_UnicodeString</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_a_UnicodeString</tt></i>Â :</span></td><td> First string of type PUNICODE_STRING.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><i><tt>string_b_UnicodeString</tt></i>Â :</span></td><td> Second string of type PUNICODE_STRING.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if <i><tt>string_a_UnicodeString</tt></i> and <i><tt>string_b_UnicodeString</tt></i> are the same.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ucs2-compare-insensitive"></a>captive_ucs2_compare_insensitive ()</h3><pre class="programlisting">gboolean captive_ucs2_compare_insensitive
+ (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_a_ucs2,
+ const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_b_ucs2);</pre><p>
+Compares case-insensitively <i><tt>string_a_ucs2</tt></i> and <i><tt>string_b_ucs2</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_a_ucs2</tt></i>Â :</span></td><td> First string of type const gunichar2 * in pure UCS-2.
+Invalid string input is forbidden. UTF-16 encoded pairs are forbidden.
+</td></tr><tr><td><span class="term"><i><tt>string_b_ucs2</tt></i>Â :</span></td><td> Second string of type const gunichar2 * in pure UCS-2.
+Invalid string input is forbidden. UTF-16 encoded pairs are forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if <i><tt>string_a_ucs2</tt></i> and <i><tt>string_b_ucs2</tt></i> are the same.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-UnicodeString-compare-insensitive"></a>captive_UnicodeString_compare_insensitive ()</h3><pre class="programlisting">gboolean captive_UnicodeString_compare_insensitive
+ (const UNICODE_STRING *string_a_UnicodeString,
+ const UNICODE_STRING *string_b_UnicodeString);</pre><p>
+Compares case-insensitively <i><tt>string_a_UnicodeString</tt></i> and <i><tt>string_b_UnicodeString</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_a_UnicodeString</tt></i>Â :</span></td><td> First string of type PUNICODE_STRING.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><i><tt>string_b_UnicodeString</tt></i>Â :</span></td><td> Second string of type PUNICODE_STRING.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if <i><tt>string_a_UnicodeString</tt></i> and <i><tt>string_b_UnicodeString</tt></i> are the same.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-FsRtlLegalAnsiCharacterArray-init"></a>captive_FsRtlLegalAnsiCharacterArray_init ()</h3><pre class="programlisting">void captive_FsRtlLegalAnsiCharacterArray_init
+ (void);</pre><p>
+Initialize FsRtlLegalAnsiCharacterArray character classes
+by appropriate FSRTL_FAT_LEGAL etc. flags.</p><p>
+
+</p></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-ps-reactos.html"><b><< ps_reactos</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-unicode-reactos.html"><b>unicode_reactos >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Operation Captive</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="index.html" title="Operation Captive Reference Manual"><link rel="previous" href="index.html" title="Operation Captive Reference Manual"><link rel="next" href="captive-apiref-init.html" title="init"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="index.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-init.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="chapter" lang="en"><div class="titlepage"><div><h2 class="title"><a name="id2872113"></a>Operation Captive</h2></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><a href="captive-apiref-init.html">init</a> - </dt><dt><a href="captive-apiref-ldr.html">ldr</a> - </dt><dt><a href="captive-apiref-macros.html">macros</a> - </dt><dt><a href="captive-apiref-mm.html">mm</a> - </dt><dt><a href="captive-apiref-ps-reactos.html">ps_reactos</a> - </dt><dt><a href="captive-apiref-unicode.html">unicode</a> - </dt><dt><a href="captive-apiref-unicode-reactos.html">unicode_reactos</a> - </dt><dt><a href="captive-apiref-storage.html">storage</a> - </dt><dt><a href="captive-apiref-ldr-exports.html">ldr_exports</a> - </dt><dt><a href="captive-apiref-calltype-reactos.html">calltype_reactos</a> - </dt><dt><a href="captive-apiref-signal.html">signal</a> - </dt><dt><a href="captive-apiref-rtl-file.html">rtl-file</a> - </dt></dl></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="index.html"><b><< Operation Captive Reference Manual</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-init.html"><b>init >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Operation Captive Reference Manual</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="next" href="ch01.html" title="Operation Captive"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="book" lang="en"><div class="titlepage"><div><table class="navigation" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">Operation Captive Reference Manual</p></th></tr></table></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><a href="ch01.html">Operation Captive</a></dt></dl></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"></td><td align="right"><a accesskey="n" href="ch01.html"><b>Operation Captive >></b></a></td></tr></table></body></html>
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.0
+Source: captive
+Version: 0.9
+Binary: captive, captive-lufs, captive-install
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Architecture: i386
+Standards-Version: 3.5.2
+Build-Depends: debhelper (>> 3.0.0), liborbit2-dev, libssl-dev, libgnomevfs2-dev, libxml2-dev (>= 2.4.29), libpopt-dev, libglib2.0-dev, libreadline4-dev, libbonobo2-dev, lufs, ntfsprogs-dev, libgnomeui-dev, gcc (>= 3.0) | gcc-3.0
+Files:
+ 9e600552363fd5d826f78ab9b32e7155 2386447 captive_0.9.tar.gz
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/cqojzD78uUT8djIRAryjAKCdOYA04vPvCm8n74+kyYpWhg/odQCfaZQR
+PL6Mr5bEqsSrY9nO+PTE6Q4=
+=8ywL
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.7
+Date: Sun, 17 Aug 2003 14:16:59 +0200
+Source: captive
+Binary: captive-lufs captive-install captive
+Architecture: source i386
+Version: 0.9
+Distribution: unstable
+Urgency: low
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Changed-By: Jan Kratochvil <pgp-44FC7632@jankratochvil.net>
+Description:
+ captive - NTFS filesystem using Microsoft Windows drivers
+ captive-install - Instant installer for Microsoft Windows platform filesystem acces
+ captive-lufs - LUFS module for Microsoft Windows platform filesystem access.
+Changes:
+ captive (0.9) unstable; urgency=low
+ .
+ * See package ChangeLog entries.
+Files:
+ ec17497c2ceb98ac38a61232bd4e2307 731 contrib/base optional captive_0.9.dsc
+ 9e600552363fd5d826f78ab9b32e7155 2386447 contrib/base optional captive_0.9.tar.gz
+ ac64c371bdcaf3305b0238945c3ef90a 342604 contrib/base optional captive_0.9_i386.deb
+ 686965b5e2def09e0d7ae551753ccce3 21730 contrib/base optional captive-lufs_0.9_i386.deb
+ c38084f6a9736abcda10a20a5f9ec5d6 54846 contrib/base optional captive-install_0.9_i386.deb
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/cqoqzD78uUT8djIRAuE5AJ93P5pUo9OWOW3GA9G4FjfllzJ2hACdF2Ut
+j/iaKH+CFycdN/jyw3rXbA8=
+=9zU3
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.0
+Source: gnome-vfs-httpcaptive
+Version: 2.3.8captive2
+Binary: gnome-vfs-httpcaptive
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Architecture: i386
+Standards-Version: 3.5.2
+Build-Depends: debhelper (>> 3.0.0), libgnomevfs2-dev, libglib2.0-dev
+Files:
+ 28b11b8bad6afd34358c7164cf115b26 548681 gnome-vfs-httpcaptive_2.3.8captive2.tar.gz
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/cQF0zD78uUT8djIRAg0BAJ41drC99NHu0WeZ1jbrOeqBVDskagCgjiBh
+LGCDaoxg6ntOx5MKZezbgbA=
+=R87D
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.7
+Date: Sun, 17 Aug 2003 14:16:59 +0200
+Source: gnome-vfs-httpcaptive
+Binary: gnome-vfs-httpcaptive
+Architecture: source i386
+Version: 2.3.8captive2
+Distribution: unstable
+Urgency: low
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Changed-By: Jan Kratochvil <pgp-44FC7632@jankratochvil.net>
+Description:
+ gnome-vfs-httpcaptive - Improved http handler for GNOME virtual file-system libraries
+Changes:
+ gnome-vfs-httpcaptive (2.3.8captive2) unstable; urgency=low
+ .
+ * See package ChangeLog entries.
+Files:
+ 17cb718d117e7d9379f82f0bd6921f5e 601 main/base optional gnome-vfs-httpcaptive_2.3.8captive2.dsc
+ 28b11b8bad6afd34358c7164cf115b26 548681 main/base optional gnome-vfs-httpcaptive_2.3.8captive2.tar.gz
+ ced34037f2394693e125d93569fa3c05 29014 main/base optional gnome-vfs-httpcaptive_2.3.8captive2_i386.deb
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/cQF5zD78uUT8djIRAi+lAJ4kX3A7BRernUTWY3ULbjyNhjjSrQCdFBjH
+BMDmPvZSKiguLfa47mNMDbM=
+=cNwB
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.0
+Source: lufs
+Version: 0.9.6captive1
+Binary: lufs
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Architecture: any
+Standards-Version: 3.5.2
+Build-Depends: debhelper (>> 3.0.0), cvs2cl, make, autoconf, libtool, automake (>= 1.6) | automake1.6 | automake1.7, gcc, perl
+Files:
+ d4b2984c65cbc7115a4e59518bc61bc7 212273 lufs_0.9.6captive1.tar.gz
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/bV1OzD78uUT8djIRAt/MAKCiIdO28pBnmP54H3LRapcY7qj+1ACeNDpn
+5ZqfZJ2Z6ce2RGbuBTctHBA=
+=Kr94
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.7
+Date: Sun, 17 Aug 2003 14:16:59 +0200
+Source: lufs
+Binary: lufs
+Architecture: source i386
+Version: 0.9.6captive1
+Distribution: unstable
+Urgency: low
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Changed-By: Jan Kratochvil <pgp-44FC7632@jankratochvil.net>
+Description:
+ lufs - lufs - Linux Userland File System
+Changes:
+ lufs (0.9.6captive1) unstable; urgency=low
+ .
+ * See package ChangeLog entries.
+Files:
+ 67ee78bb425fb97a80bc4d758b450c8d 606 base optional lufs_0.9.6captive1.dsc
+ d4b2984c65cbc7115a4e59518bc61bc7 212273 base optional lufs_0.9.6captive1.tar.gz
+ 0e961a01e470e5f53f002f07d5b21cef 138556 base optional lufs_0.9.6captive1_i386.deb
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/bV1UzD78uUT8djIRAv3oAJ48WvewJ2L3NryqgnUkj+KUazSp9wCgqqWZ
+Qi41hMzoXysrrqn1rB6Ce0M=
+=cBEy
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.0
+Source: ntfsprogs-gnomevfs
+Version: 1.0
+Binary: ntfsprogs-gnomevfs
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Architecture: i386
+Standards-Version: 3.5.2
+Build-Depends: debhelper (>> 3.0.0), libgnomevfs2-dev, libglib2.0-dev, ntfsprogs-dev
+Files:
+ f09c3b0bd5472b52f4fc9aee01ebc4cd 312258 ntfsprogs-gnomevfs_1.0.tar.gz
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/bfcWzD78uUT8djIRArd0AJ0bsfWvluoGAiftB4EcdS0YPPZBsgCfR9Gr
+SCBZbK+UNlftMm1M0WufI2Q=
+=yfRZ
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.7
+Date: Sun, 17 Aug 2003 14:16:59 +0200
+Source: ntfsprogs-gnomevfs
+Binary: ntfsprogs-gnomevfs
+Architecture: source i386
+Version: 1.0
+Distribution: unstable
+Urgency: low
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Changed-By: Jan Kratochvil <pgp-44FC7632@jankratochvil.net>
+Description:
+ ntfsprogs-gnomevfs - NTFS filesystem library GNOME virtual file-system interface
+Changes:
+ ntfsprogs-gnomevfs (1.0) unstable; urgency=low
+ .
+ * See package ChangeLog entries.
+Files:
+ d31a9ba8f6042adb6c7c477f9b9628c9 587 main/base optional ntfsprogs-gnomevfs_1.0.dsc
+ f09c3b0bd5472b52f4fc9aee01ebc4cd 312258 main/base optional ntfsprogs-gnomevfs_1.0.tar.gz
+ e6eb04edc54ed4e4d44b4ab3ccaa407f 9906 main/base optional ntfsprogs-gnomevfs_1.0_i386.deb
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/bfcbzD78uUT8djIRAhOJAJ0fgxxdJ7dGHxJWVAby6ahP/0NOBgCfbGh5
+Rr9PQBIl5yIC5VR/55f69g0=
+=qs70
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.0
+Source: ntfsprogs
+Version: 200309071734captive1
+Binary: ntfsprogs, ntfsprogs-dev
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Architecture: i386
+Standards-Version: 3.5.2
+Files:
+ d1d605893444b80fd837301320dd2261 535278 ntfsprogs_200309071734captive1.tar.gz
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/bdcpzD78uUT8djIRAjnhAKCE3ofdN1P9M434xfCqJTuqAVSHSQCdFiq1
+0Mg8noB5XT55apyd7hq6RbI=
+=LrBu
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.7
+Date: Tue, 09 Sep 2003 08:22:48 +0200
+Source: ntfsprogs
+Binary: ntfsprogs ntfsprogs-dev
+Architecture: source i386
+Version: 200309071734captive1
+Distribution: unstable
+Urgency: low
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Changed-By: Jan Kratochvil <pgp-44FC7632@jankratochvil.net>
+Description:
+ ntfsprogs - NTFS filesystem libraries and utilities
+ ntfsprogs-dev - files required to compile software that uses libntfs
+Changes:
+ ntfsprogs (200309071734captive1) unstable; urgency=low
+ .
+ * See package ChangeLog entries.
+Files:
+ d4fd74a7e479d42cb3e375c0c50f0694 524 contrib/base optional ntfsprogs_200309071734captive1.dsc
+ d1d605893444b80fd837301320dd2261 535278 contrib/base optional ntfsprogs_200309071734captive1.tar.gz
+ 202a161dc4b512e94ed4ef65a798b33a 169968 contrib/base optional ntfsprogs_200309071734captive1_i386.deb
+ 80b2f06832c66bb07c439f7c7e175b64 91630 contrib/base optional ntfsprogs-dev_200309071734captive1_i386.deb
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/bdcuzD78uUT8djIRAvX4AJoC11uEH2aQNfmLgeRGOOU5u0098gCcDHpS
+cN3+Cbhbo775wc68qlvhSqw=
+=FheU
+-----END PGP SIGNATURE-----
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project doc Index page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::doc::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+use vars qw($VERSION $CVS_ID);
+$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+$CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+
+
+My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS doc',
+ "head_css"=>"
+.productname { font-family: cursive; }
+.fname { font-family: monospace; }
+.constant { font-family: monospace; }
+.author { font-family: cursive; }
+.stuff { font-style: italic; font-size: larger; margin-left: 20%; margin-right: 10%; }
+.function { font-family: monospace; }
+.type { font-family: monospace; }
+.command { font-family: monospace; }
+.instruction { font-style: italic; }
+",
+ );
+My::Web->heading();
+
+
+sub doc_img
+{
+my($img_base,$caption)=@_;
+
+ my $r="";
+ $r.='<table border="0" align="center">'."\n";
+ $r.="\t<tr><td>".img($img_base,$caption)."</td></tr>\n";
+ $r.="\t<caption>".CGI::escapeHTML($caption)."</caption>\n";
+ $r.='</table>'."\n";
+ return $r;
+}
+
+my $freespeech=a_href 'http://www.gnu.org/philosophy/free-sw.html','Free';
+my $freebeer=a_href 'http://www.gnu.org/philosophy/free-sw.html','free (as in beer)';
+
+sub productname
+{
+my($url,$name)=@_;
+
+ return '<span class="productname">'.a_href($url,CGI::escapeHTML($name)).'</span>';
+}
+my $Wine=productname 'http://www.winehq.com/','Wine';
+my $ReactOS=productname 'http://www.reactos.com/','ReactOS';
+my $LinuxNTFS=productname 'http://linux-ntfs.sourceforge.net/','Linux NTFS';
+my $GnomeVFS=productname 'http://developer.gnome.org/doc/API/gnome-vfs/','Gnome-VFS';
+my $GnomeVFSmodule=productname 'http://developer.gnome.org/doc/API/gnome-vfs/modules.html','Gnome-VFS-module';
+my $gnulinux='GNU/Linux';
+
+
+print vskip("10ex")."<h1 align=\"center\">!!! PRELIMINARY - TO BE UPDATED !!!</h1>\n".vskip("10ex");
+
+print <<"HERE";
+<h1>Abstract</h1>
+
+<p>Existing binary Microsoft Windows file system drivers were exploited
+for accessing drives with possibly proprietary file system data structures.
+Open file system API is provided to access these file system drivers.
+Microsoft Windows system components required by these drivers
+were analyzed and successfuly emulated in the GNU/Linux operating system.
+Currently the implementation allows applications running under the GNU/Linux
+operating system to access VFAT, ISO9660 and EXT2 drives. NTFS file system
+capability target is the final goal being currently developed on the base
+of this project assets.</p>
+
+
+<h1>Reasons for the Implementation</h1>
+
+ <p>Currently there is no possibility to any of the available $freespeech
+ ($freespeech used in the following text in the meaning of
+ "<a href="http://www.gnu.org/philosophy/free-sw.html">free as in speech</a>")
+ operating systems to reliably write to the most common disk partition
+ filesystem type - <span class="productname">Microsoft NTFS</span>. It would
+ be already supported a long time ago but there is no proper documentation of
+ <span class="productname">NTFS</span> filesystem data structures available.
+ Since <span class="productname">Microsoft</span> corporation continues in its
+ propagation of <span class="productname">Microsoft Windows NT</span>
+ (<span class="productname">NT</span> identifier used in the following text
+ applies to all the products of <span class="productname">Microsoft</span>
+ <span class="productname">NT</span> series such as
+ <span class="productname">NT 4.0</span>,
+ <span class="productname">2000</span> as NT-5.0
+ and
+ <span class="productname">XP</span> as NT-5.1.)
+ based operating systems <span class="productname">NTFS</span> is the default
+ disk file system type for new installations as described in the
+ <a href="http://www.microsoft.com/hwdev/tech/storage/ntfs-preinstallP.asp">recommendations
+ report</a> by <span class="productname">Microsoft</span>.</p>
+
+ <p>Unfortunately the <span class="productname">NTFS</span> filesystem has too
+ complex data structure to allow a complete reverse enginnering process in
+ reasonable time. Currently available $freespeech solutions such as $LinuxNTFS
+ filesystem have already implemented (more or less) reliable reverse
+ engineered read-only access. However <a name="reliability">the
+ reliability</a> of the read-write part of the access requires much better
+ knowledge of the <span class="productname">NTFS</span> data structures. Also
+ any future versions of <span class="productname">NTFS</span> filesystem would
+ require another major reverse engineering effort.</p>
+
+
+<h1>Goals of This Stage of the Project</h1>
+
+ <p>The <a name="NTFSgoal">ultimate goal</a> of this project is definitely the
+ free implementation of <a href="#reliability">reliable</a> read-write <span
+ class="productname">NTFS</span> filesystem driver. This project chose to
+ solve this problem in the style of $Wine project by using the original binary
+ <span class="fname">ntfs.sys</span> and emulating all the required layers of
+ <span class="productname">Microsoft Windows NT</span> for it.</p>
+
+ <p>Unfortunately this effort is tainted by only partial and generally
+ insufficient documentation of API between filesystem driver
+ (<span class="fname">ntfs.sys</span>) and the
+ <span class="productname">Microsoft Windows NT</span>
+ ("<a href="http://mail.gnu.org/archive/html/libtool/2000-09/msg00000.html">W32</a>"
+ in the following text) kernel <span class="fname">ntoskrnl.exe</span>. Note
+ that this API is a different than the one being used in the $Wine project
+ since <span class="productname">Wine</span> implements only the user space
+ part of W32.</p>
+
+ <p>There also exists a $freespeech
+ <span class="fname"><a href="http://sys.xiloo.com/projects/projects.htm#ext2fsd">ext2fsd.sys</a></span>
+ W32 filesystem driver for <span class="constant">ext2</span> filesystems with
+ source files freely available for it. Moreover original
+ <span class="productname">Microsoft Windows NT</span> filesystems
+ <span class="fname">cdfs.sys</span> and
+ <span class="fname">fastfat.sys</span> (which correspond to Linux
+ <span class="productname">iso9660</span> and
+ <span class="productname">vfat</span> filesystems, resp.) are easy enough to
+ get working in reasonable time. All these filesystem drivers also use only
+ the documented filesystem data structures which makes their behaviour better
+ controllable when debugging the project.</p>
+
+ <p>Therefore this stage of the project is intended to get only the original
+ W32 binary form of <span class="fname">cdfs.sys</span> and
+ <span class="fname">fastfat.sys</span> drivers working. This goal was
+ achieved and the compatibility with <span class="fname">ext2fsd.sys</span>
+ can be considered as an additional benefit.</p>
+
+
+<h1>Architecture</h1>
+
+ <p>Although this project attempts to be as general and crossplatform as
+ possible to avoid being needlessly bound by any resources the current
+ implementation is being developed/tested on $gnulinux. The principle of the
+ project lies in the glue between
+ <span class="productname">Microsoft Windows NT</span> kernel space
+ environment and $gnulinux user space process environment. Currently there are
+ no plans to ever extend the project's crossplatformity beyond the
+ <span class="constant">i386</span> processor
+ (<span class="constant">i386</span> used here as
+ <a href="http://www.intel.com/">Intel</a> architecture covering 32-bit
+ processors compatible with <span class="constant">i386</span>,
+ <span class="constant">i486</span>, ...).
+
+ <a name="existing_emulation"><h2>Existing Emulation Projects</h2></a>
+
+ <p>There are two well-known $freespeech projects emulating W32 subsystems
+ to reach the compatibility with various W32 components:
+ $Wine and $ReactOS. Sad moment is that the goals of this project do not fit
+ very well into any role in those two projects:
+
+ <table align="center" border="1">
+ <tr>
+ <th><a href="#guestosnote">Guest-OS</a></th>
+ <th><a href="#hostosnote" >Host-OS</a ></th>
+ <th>Implements</th>
+ <th>W32 kernel library</th>
+ </tr>
+ <tr>
+ <td>$Wine</td>
+ <td>$gnulinux</td>
+ <td>W32 user space</td>
+ <td><span class="fname">ntdll.dll</span></td>
+ </tr>
+ <tr>
+ <td>$ReactOS</td>
+ <td><span class="constant">i386</span> hardware</td>
+ <td>W32 kernel and user space</td>
+ <td><span class="fname">ntoskrnl.exe</span></td>
+ </tr>
+ <caption>Existing Emulation Projects Characteristics</caption>
+ </table>
+
+ <dl>
+ <a name="guestosnote"><dt>Guest-OS</dt></a>
+ <dd><a href="http://www.vmware.com/support/reference/common/glossary/#guestos">Guest OS</a>:
+ An operating system that runs inside a virtual machine.</dd>
+ <a name="hostosnote" ><dt>Host OS</dt></a>
+ <dd><a href="http://www.vmware.com/support/reference/common/glossary/#hostos" >Host OS</a>:
+ An operating system that runs on the host machine.</dd>
+ </dl>
+
+ <p>While $ReactOS provides the necessary W32 kernel subsystem emulation
+ code we also need to run such <a href="#guestosnote">Guest-OS</a> in the <a
+ href="#hostosnote">Host-OS</a> $gnulinux. Initially it was planned to
+ extend $Wine with the W32 kernel space emulation functionality but
+ fortunately <span class="author">Steven Edwards</span> pointed to the $ReactOS
+ which better suits the needs of this project by its already implemented W32
+ kernel space emulation.</p>
+
+ <p>The <a name="reactos_nocare">original reasons</a> for developing
+ $ReactOS still make no sense to the author of this project. Free
+ implementation of W32 platform standalone running on the machine hardware
+ is no longer free as most od the W32 applications are usually closed source
+ and the user still looses its freedom on the application level anyway. Even
+ in the case of available free applications there still remains the
+ disadvantage of loosing the Host-OS platform availability if implemented in
+ the $Wine style. For these ideology incompatibilities not much effort was
+ made for acceptance the fixes and improvements of $ReactOS by this project.
+ Moreover new functionality is not being implemented to the $ReactOS part
+ but it is coded in Gnome style in the project specific source files
+ place.</p>
+
+ <p>The most serious problem of $ReactOS is its dependence on the direct
+ <span class="constant">i386</span> hardware instead of some
+ <a href="#hostosnote">Host-OS</a> as required by the goals of this project.
+ W32 is designed to be hardware-independent using its
+ <span class="fname">hal.dll</span>. Unfortunately $ReactOS does not follow
+ this design and thus there are needed various patches and replaces of its
+ various parts and its hardware-dependent code. Despite it $ReactOS code
+ base still made a big asset for this project.</p>
+
+
+
+
+
+ <p>Some API functions are provided both by
+ <span class="fname">ntdll.dll</span> and
+ <span class="fname">ntoskrnl.exe</span> in W32.
+ <span class="author">Casper Hornstrup</span> enlightened such functions
+ calling conventions have to be differentiated as
+ <span class="fname">ntdll.dll</span> lives in the user space (low address
+ space -- below <span class="constant">0x80000000</span>) and
+ <span class="fname">ntoskrnl.exe</span> in the kernel space (high address
+ space -- above <span class="constant">0x80000000</span>). Although they
+ contain slightly different set of symbols (functions)
+ <span class="fname">ntdll.dll</span> still can be considered as a user
+ space interface to the kernel space implementation by
+ <span class="fname">ntoskrnl.exe</span>.</p>
+
+ <h2>API Function Implementation Choices</h2>
+
+ <p>During the initial point of the project development all the API
+ functions were defined as unimplemented, of course. Any call of such
+ unimplemented function is fatal and results in program termination. When we
+ need to implement any required API function we have multiple choices to do
+ so:
+ <a href="#functype_pass">Direct pass to original
+ <span class="fname">ntoskrnl.exe</span></a>,
+ <a href="#functype_wrap">Wrap of the original
+ <span class="fname">ntoskrnl.exe</span> function</a>,
+ <a href="#functype_native_reactos">Native implementation -- $ReactOS,
+ <a href="#functype_native_wine">Native implementation -- $Wine
+ or
+ <a href="#functype_native_libcaptive">Native implementation
+ -- project specific</a>.
+ <!-- a href="#functype_undef" Undefined function /a -->
+
+ <h2>"patched" vs. "unpatched" Libraries</h2>
+
+ <p>Library is called <span class="constant">patched</span> if we require
+ loading its original binary code file. Project needs to patch it to be able
+ to trap all the function entry points. The typical current
+ <span class="constant">patched</span> library of this project is
+ <span class="fname">ntoskrnl.exe</span>.</p>
+
+ <p>Library is called <span class="constant">unpatched</span> if no original
+ binary code is needed since all of its functions are completely emulated by
+ <a href="#functype_native">the native implementations</a> of this project.
+ The typical <span class="constant">unpatched</span> representative is
+ <span class="fname">hal.dll</span> as it specializes on the hardware
+ dependent code and therefore it must be completely replaced by this project
+ running in the $gnulinux operating system environment. Early versions of
+ this project had also full <span class="constant">unpatched</span>
+ <a href="#native_ntoskrnl">native implementation of
+ <span class="fname">ntoskrnl.exe</span></a> but it no longer applies.</p>
+
+ <h2>Memory Management</h2>
+
+ <p>Original <span class="productname">Microsoft Windows NT</span>
+ architecture uses two address space areas - user space and kernel space.
+ User space is mapped in the range <span class="constant">0x00000000</span>
+ to <span class="constant">0x7FFFFFFF</span>, kernel space is mapped in the
+ range <span class="constant">0x80000000</span>
+ (<span class="constant">KERNEL_BASE</span> in $ReactOS sources) to
+ <span class="constant">0xFFFFFFFF</span>. All these virtual memory ranges
+ represent addresses after their MMU (Memory Management Unit) mapping, of
+ course. More discussion can be found in the
+ <a href="http://www.microsoft.com/hwdev/platform/server/PAE/PAEmem.asp">description
+ by <span class="productname">Microsoft</span></a>.</p>
+
+ <p>This project runs in the virtual address space used both for the UNIX
+ user space process part and for the W32 kernel space. Therefore this
+ project defines that W32 kernel runs in the whole range
+ <span class="constant">0x00000000</span> to
+ <span class="constant">0xFFFFFFFF</span> since there are no special mapping
+ assumptions about the UNIX user space process mapping. No W32 user space
+ exists in this project. Such approach also nullifies any special memory
+ moving operations between W32 kernel space and W32 user space memory areas
+ (such as <span class="function">MmSafeCopyToUser()</span>).</p>
+
+ <h2>Unicode Strings and Characters</h2>
+
+ <p>W32 platform uses 16-bit type <span class="type">wchar_t</span> while $gnulinux uses a
+ 32-bit one. This can be problem during GCC (GNU C Compiler)
+ compilation of combination of native UNIX C sources (assuming 32-bit
+ GCC with 32-bit <span class="type">wchar_t</span>) and
+ $ReactOS C sources (assuming W32 compiler with 16-bit
+ <span class="type">wchar_t</span>) for literal wide strings
+ (C source file systax: <span class="command">L"wstring"</span>).
+ Possibilities to solve this issue list:</p>
+
+ <ul>
+ <li>
+ <p>Using <span class="constant">-fshort-wchar</span> GCC option and
+ strictly differentiate between compilation of
+ <span class="productname">ReactOS</span> code and UNIX code.</p>
+
+ <p>pros: No source modifications needed, no runtime performance hit.</p>
+
+ <p>cons: No type checking if some part of code has bad compilation
+ flags, complicated way to completely split
+ <span class="productname">ReactOS</span> and UNIX code.</p>
+ </li>
+ <li>
+ <p>Wrap all <span class="productname">ReactOS</span> literal constants
+ by some conversions function call (implemented as macro
+ <span class="function">REACTOS_UCS2()</span> by this project).</p>
+
+ <p>pros: Any forgotten/mistaken conversions are type-checked and warned
+ during the compilation by GCC.</p>
+
+ <p>cons: All compiled <span class="productname">ReactOS</span> sources
+ files containing literal wide strings have to be wrapped/modified,
+ performance hit by runtime string conversions.</p>
+
+ <p>This solution was chosen to get the internal sanity checking
+ benefit.</p>
+ </li>
+ </ul>
+
+ <h2>Supported Binary Formats</h2>
+
+ <p>The native W32 binary format is identified as
+ <span class="constant">PE-32</span> (Portable Executable 32-bit), such
+ files have all the usual extensions such as
+ <span class="fname">.sys</span>, <span class="fname">.exe</span>,
+ <span class="fname">.dll</span> etc. <span class="constant">PE-32</span>
+ loading support was already implemented by $ReactOS, its memory mapping
+ specifics just had to be ported to $gnulinux environment by this project.
+ This loading support does not (yet) cover importing of debug symbols from
+ W32 <span class="fname">.PDB</span> (Program DataBase) files in $gnulinux
+ ABI (Application Binary Interface) compatible way.</p>
+
+ <p>This project also supports transparent loading of UNIX
+ <span class="fname">.so</span> (Shared Object file) binary format. If you
+ have W32 source files for some W32 library you can try to compile it by GCC
+ to get the shared library with $gnulinux ABI compatible debug information
+ (GCC option <span class="constant">-ggdb3</span> recommended). Beware of
+ possible compilation problems as <span class="productname">Microsoft</span>
+ C code expects <span class="constant">exception</span> handling to be
+ supported by the compiler (definitely not the case of the plain C compiler
+ of GCC) --- all the exception catching code should be discarded as any
+ <a href="#exception_fatal">generated exceptions are always fatal</a> when
+ such driver is running in the scope of this project.</p>
+
+ <p>Be aware of some differences if you use
+ <span class="constant">PE-32</span> binary format file vs.
+ <span class="fname">.so</span> format file.
+ <span class="constant">PE-32</span> use the appropriate W32 specific
+ <a href="#calltype">cdecl/stdcall/fastcall call types</a>,
+ <span class="fname">.so</span> must be completely compiled in the standard
+ UNIX <a href="#calltype_cdecl">cdecl call type semantics</a>.
+ <a href="#functype_native">Native function implementations</a> do not need
+ to be explicitely exported by <span class="fname">captivesym</span> as they
+ are resolved automatically by the UNIX dynamic system linker. It may be
+ surprising you will have to fix all such missing symbol exports if you
+ advance during the development from the debugging
+ <span class="fname">.so</span> file for the production version of the
+ original <span class="constant">PE-32</span> binary file.</p>
+
+ <h2>Reverse Engineering</h2>
+
+ <p>This project has no intentions to reverse engineer and document the
+ filesystem data structures themselves since they are being encapsulated by
+ the filesystem driver. For these reasons the resources available in
+ projects such as $LinuxNTFS get out of any possible use. This project goal
+ is to provide fully compatible API interface to the rest of the W32 system
+ to persuade the filesystem driver it is running in the native
+ <span class="productname">Microsoft Windows XP</span> environment.</p>
+
+ <p>All the W32 filesystem drivers are running in the W32 kernel address
+ space and this area of W32 API is not much documented by
+ <span class="productname">Microsoft</span>. Some API functions are not
+ documented at all and the others are documented insufficiently for a their
+ possibly needed reimplementation from scratch. Documentation being
+ consulted primarily consists of
+ <span class="productname"><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/kmarch/hh/kmarch/kmhdr_6enb.asp">MSDN (Microsoft Developer Network) Kernel-Mode Driver Architecture: Windows DDK</a></span>
+ documentation and also various other 3rd party documentation resources such as
+ <span class="productname"><a href="http://www.osr.com/ntinsider/1996/cacheman.htm">The NT Cache Manager Description</a></span>,
+ <span class="productname"><a href="http://www.winntmag.com/Articles/Print.cfm?ArticleID=3864">Learn About NT's File-system Cache</a></span>,
+ <span class="productname"><a href="http://www.ntfsd.org/archive/">NT File System Developers mailing list archives</a></span>
+ including various
+ <a href="http://www.google.com/search?q=site%3Amicrosoft.com">fulltext searches</a>
+ through Internet from case to case.</p>
+
+ <p>Sometimes no sufficient documentation was found and some code behaviour
+ had to be reverse engineered directly from the binaries of
+ <span class="fname">ntoskrnl.exe</span>,
+ <span class="fname">cdfs.sys</span>
+ and/or
+ <span class="fname">fastfat.sys</span>.
+ Up to now the code was disassembled by
+ <span class="productname"><a href="http://www.simtel.net/pub/pd/29498.html">IDA Freeware</a></span>
+ and by
+ <span class="productname">dumpbin.exe</span> of
+ <span class="productname">Microsoft Visual Studio</span>.
+ <span class="productname">dumpbin.exe</span> is fortunately able to
+ interpret debug symbols from W32 <span class="fname">.PDB</span>
+ (Program DataBase) debug information files.</p>
+
+ <a name="law"><h2>Laws and Licensing Conditions</h2></a>
+
+ <p>If you are an <span class="productname">authorized user</span> of
+ <span class="productname">Microsoft Windows NT</span> the laws in some
+ countries give you the right to fully handle the product in any way you
+ want. Therefore you can disassemble the product even in the case you had
+ to agree with the product license forbidding such disassembly as the
+ country laws override any such license agreement.</p>
+
+ <h3>Microsoft Service Pack</h3>
+
+ <p>Sometimes you may have the legal license for
+ <span class="productname">Microsoft Windows NT</span>
+ but for various technical reasons you do not have the media and/or
+ installation ready at the place of intended use of this project.</p>
+
+ <p>Fortunately <span class="productname">Microsoft</span> provides
+ $freebeer update packages for its
+ <span class="productname">Microsoft Windows</span> products called
+ <span class="productname">Service Packs</span>; the latest one is
+ <span class="productname"><a href="http://www.microsoft.com/WindowsXP/pro/downloads/servicepacks/sp1/checkedbuild.asp">Microsoft Windows XP Service Pack 1a</a></span>.</p>
+
+ <p>This downloadable file contains the full versions of the essential
+ files needed for the current stage of this product:
+ <span class="fname">cdfs.sys</span>,
+ <span class="fname">fastfat.sys</span>
+ and
+ <span class="fname">ntoskrnl.exe</span>.
+ It even contains <span class="fname">ntfs.sys</span> for the planned
+ <a href="#NTFSgoal"><span class="productname">NTFS</span>
+ functionality</a>.</p>
+
+ <p><span class="productname">Service Pack</span> also contains
+ EULA (End User License Agreement) paper disallowing any use of
+ <span class="productname">Service Pack</span> outside its original
+ intentions. According to the laws of some countries you need to be
+ <span class="productname">authorized user</span> of the
+ <span class="productname">Microsoft Windows XP</span> product to be
+ allowed to use the files contained in such
+ <span class="productname">Service Pack</span> without the bindings of its
+ EULA. Even the interpretation of such laws may vary.</p>
+
+ <p>It would be a breach of the law by the project author to provide
+ automatic (=hidden) functionality to download and extract the
+ <span class="productname">Service Pack</span> files. On the other hand it
+ is perfectly legal to ask user for his/her confirmation whether he/she is
+ really the <span class="productname">authorized user</span> of
+ <span class="productname">Microsoft Windows XP</span> product and
+ download/extract the <span class="productname">Service Pack</span> files
+ accordingly.</p>
+
+ <h2>Project Architecture</h2>
+
+ @{[ doc_img 'fig/architecture','Project Architecture' ]}
+
+ <p>Most of the work of this project is located in the single box called
+ "<span class="constant">libcaptive</span>" located in the center
+ of the scheme. This component implements the core W32 kernel API by
+ <a href="#functype">various methods described in this document</a>.
+ The "<span class="constant">libcaptive</span>" box cannot be
+ further dissected as it is just an implementation of a set of API
+ functions. It could be separated to several subsystems such as the Cache
+ Manager, Memory Manager, Object Manager, Runtime Library, I/O Manager
+ etc. but they have no interesting referencing structure.</p>
+
+ <p>As this project is in fact just a filesystem implementation every
+ story must begin at the device file and end at the filesystem operations
+ interface. The unified suppported interfaces are
+ <span class="productname"><a href="http://developer.gnome.org/doc/API/2.0/glib/">GLib</a></span>
+ (the most low level portability, data-types and utility library for Gnome)
+ <span class="type">GIOChannel</span> (for the device access) and the custom
+ <span class="constant">libcaptive</span> filesystme API. Each of these ends
+ can be connected either to some direct interface (such as the
+ <span class="constant">captive-cmdline</span> client) or it can connected
+ as a general $GnomeVFS filter. $GnomeVFS offers nice filter interface on
+ the UNIX user-privileges level for transparent operation with archives and
+ network protocols. This filter interface was used by this project to turn
+ the device reference such as <span class="fname">/dev/hda3</span> or
+ <span class="fname">/dev/discs/disc0/part3</span> to the fully accessible
+ filesystem (pretending being an "archive" in the device
+ reference). This device access can be specified by $GnomeVFS URLs such as:
+ <span class="fname">file:///dev/hda3#captive-fastfat:/autoexec.bat</span></p>
+
+ <p>If the passed device reference is requested by the user to be accessed
+ either in <span class="dashdash">--ro</span> (read-only) mode or in the
+ <span class="dashdash">--rw</span> (full read-write) mode there are no
+ further device layers needed. Just in the case of
+ <span class="dashdash">--blind</span> mode another layer is involved to
+ emulate read-write device on top of the real read-only device by the method
+ of non-persistent memory buffering of all the possible write requests.</p>
+
+ <p>Such device is still only a UNIX style GLib <span
+ class="type">GIOChannel</span> type at this point. As we need to supply it
+ to the W32 filesystem driver we must convert it to the W32 I/O Device
+ with its capability of handling <span class="type">IRP</span>
+ (<span class="constant">I/O Request Packet</span>; structure holding the
+ request and result data for any W32 filesystem or W32 block device
+ operation)
+ requests from its upper W32 filesystem driver. Such W32 I/O Device can
+ represent either <span class="type">CD-ROM</span> or
+ <span class="type">disk</span> device type as different W32 filesystem
+ drivers require different media types:</p>
+
+ <h3>cdfs.sys</h3>
+
+ <p><span class="type">CD-ROM</span> filesystem runs just on the
+ <span class="constant">FILE_DEVICE_CD_ROM_FILE_SYSTEM</span> device type.
+ Use <span class="dashdash">--cdrom</span> option of this project for
+ <span class="fname">cdfs.sys</span>.</p>
+
+ <h3>fastfat.sys</h3>
+
+ <p><span class="type">FAT</span> filesystem supports both the (expected)
+ <span class="constant">FILE_DEVICE_DISK_FILE_SYSTEM</span> device type
+ but it also supports the reading of
+ <span class="constant">FILE_DEVICE_CD_ROM_FILE_SYSTEM</span> devices as
+ you can use <span class="type">FAT</span> filesystem on <span
+ class="type">CD-ROM</span> media in W32 environment. It is recommended to
+ use <span class="dashdash">--disk</span> option of this project for
+ <span class="fname">fastfat.sys</span>.</p>
+
+ <h3>ext2fsd.sys</h3>
+
+ <p><span class="type">ext2</span> filesystem supports just the
+ <span class="constant">FILE_DEVICE_DISK_FILE_SYSTEM</span> device type.
+ Use <span class="dashdash">--disk</span> option of this project for
+ <span class="fname">ext2fsd.sys</span>.</p>
+
+ @{[ vskip("3ex") ]}
+
+ <p>W32 media I/O Device is accessed from the W32 filesystem driver.
+ The filesystem driver itself always creates volume object by
+ <span class="function">IoCreateStreamFileObject()</span> representing the
+ underlying W32 media I/O Device as the object handled by the
+ filesystem driver itself. All the client application filesystem requests
+ must be first resolved at the filesystem structures level, passed to the
+ volume stream object of the same filesystem and then finally passed to the
+ W32 media I/O Device (already implemented by this project as an
+ interface to <span class="type">GIOChannel</span> noted above).</p>
+
+ <p>The filesystem driver is called by the core W32 kernel implementation of
+ <span class="constant">libcaptive</span> in
+ <a href="#synchronous">synchronous way</a> in single-shot manner instead of
+ the several reentrancies while waiting for the disk I/O completions as can
+ be seen in the original
+ <span class="productname">Microsoft Windows NT</span>.
+ This single-shot synchronous behaviour is possible since all the needed
+ resources (disk blocks etc.) can be always presented as instantly ready as
+ their acquirement is solved by <a href="hostosnote">Host-OS</a> outside of
+ the W32 emulated <a href="guestosnote">Guest-OS</a> environment.</p>
+
+ <p><span class="constant">libcaptive</span> offers the W32 kernel
+ filesystem API to the upper layers. This is still not the API the common
+ W32 applications are used to as they use W32 libraries which in turn pass
+ the call to W32 kernel. For example
+ <span class="function">CreateFileA()</span> is being implemented by several
+ libraries such as <span class="fname">user32.dll</span> as a relay
+ interface for the kernel function
+ <span class="function">IoCreateFile()</span> implemented by this
+ project's <span class="constant">libcaptive</span> W32 kernel
+ emulation component.</p>
+
+ <p>As it would be very inconvenient to use the legacy, bloated and UNIX
+ style unfriendly W32 kernel filesystem API this project offers its own
+ <a href="#client_interface">custom filesystem API interface</a> inspired by
+ the $GnomeVFS client interface adapted to the specifics of W32 kernel API.
+ This interface is supposed to be easily utilized by
+ <a href="#client_interface_customapp">a custom application accessing
+ the W32 filesystem driver</a>.</p>
+
+ <p>The rest of the story is not much special for this project since this is
+ a common UNIX problem how to offer user space implemented UNIX filesystem
+ as a generic system filesystem (as those are usually implemented only as
+ the components od UNIX kernel). The most thin implementation would be to
+ implement <FIXME:LUFS><a href="#fuse_interface">FUSE \bookcitation{FUSE}
+ (Filesystem in Userspace project for $gnulinux implemented by its own
+ filesystem code for Linux kernel)
+ interface</a> for the purpose but such feature is not yet implemented.
+ Currently this project implements
+ <a href="#offered_gnomevfs">Gnome-VFS interface</a> allowing its filesystem
+ access even without any involvement of UNIX kernel from any
+ $GnomeVFS aware client application (such as
+ <span class="fname">gnome-vfs/tests/test-shell</span>).
+ This <a href="#offered_gnomevfs">Gnome-VFS interface</a> connects the data
+ flow of this project in two points - both as the lowest layer device image
+ source and also as the upper layer for the filesystem operation
+ requests.</p>
+
+ <p>That's all folks!</p>
+
+ <a name="mounted_one"><h2>At Most One Mounted Filesystem</h2></a>
+
+ @{[ doc_img 'fig/sandbox','Multiple Filesystems by libcaptive Sandboxing' ]}
+
+ <p>The project technically supports only one (exactly one...) mounted
+ filesystem device and only one filesystem driver. There is nothing
+ complicated to support multiple disks and multiple loaded filesystem
+ modules but as they would share the address space it would only bring
+ a possible complications during bug reports and the bug solving
+ itself. It was considered as a more sane way to support multiple W32
+ mounted disks by completely separately running project instances in
+ a different UNIX processes communicating from their sandboxes via
+ <a href="#todo_sandbox">CORBA sandbox interface</a>. This sandboxing
+ feature is not yet deployed although its code is already prepared.</p>
+
+ <p>The project also does not support any state cleanup to be able to load
+ filesystem <span class="constant">A</span>,
+ cleanup <span class="constant">A</span> and load a different
+ filesystem <span class="constant">B</span> in the same process address
+ space. It complies with the preventions of the possible debugging
+ complications as noted above. Despite this you still must call the function
+ <span class="function">captive_shutdown()</span> to flush all the pending
+ filesystem buffers to the disk. After calling
+ <span class="function">captive_shutdown()</span> the process address space is
+ no longer usable for any further project operations and the process is
+ expected to be terminated in the manner compatible with its driving
+ <a href="#todo_sandbox">CORBA sandbox interface</a> control master.</p>
+
+ <p>Each sandbox executing the untrusted W32 binary filesystem driver code
+ is connected through its
+ <a href="#todo_sandbox">CORBA sandbox interface</a> at the point of upper
+ layer <span class="constant">libcaptive</span>-specific filesystem API, at
+ the point of the bottom layer of <span class="type">GIOChannel</span>
+ device access and also for transfers of GLib logging
+ messages/warnings/errors out of the sandbox to the user.</p>
+
+
+<h1>Choice of the Emulation Methods</h1>
+
+ <p>The intent of the project was to get reliable read-write access to
+ <span class="productname">NTFS</span> partition. There are several possible
+ ways to achieve that:</p>
+
+ <h2>Virtualmachine Running the Original W32 Subsystem</h2>
+
+ <p>Creating virtual-hardware PC and running the original W32 binaries
+ including their boot-loader etc. Disk device access would be passed as
+ virtual IDE disk (=hard disk drive). File access API would be implemented
+ either by special escaping by some trapped instruction out of the
+ virtualmachine while using W32 file access API or using the standard W32
+ SMB (Server Message Block) network access through some virtual network
+ card. The latter network access solution is almost the currently available
+ possibility of running full-blown disk-sharing real
+ <span class="productname">Microsoft Windows NT</span> inside virtual
+ machine emulator such as <span class="productname">VMware</span>.</p>
+
+ <p>pros: Full compatibility due to fully native codebase.</p>
+
+ <p>cons: Hard to debug, missing documentation of NT booting internals,
+ possible problems by different PC virtual-hardware than expected by NT,
+ requirement of fully installed
+ <span class="productname">Microsoft Windows NT</span> product.</p>
+
+ <a name="method_ntoskrnl"><h2>"ntoskrnl.exe" Inside Virtual Address Space</h2></a>
+
+ <p>This solution was chosen by the project. Binary filesystem driver and
+ also <span class="fname">ntoskrnl.exe</span> binary file are required.
+ Unfortunately <span class="fname">ntoskrnl.exe</span> expects a native
+ PC virtual-hardware missing during regular UNIX user space process
+ emulation, therefore such instructions must be trapped and emulated/ignored
+ from case to case.</p>
+
+ <p>Also the <a name="init_ntoskrnl">initialization code of <span
+ class="fname">ntoskrnl.exe</span></a> is not executed by this project since
+ it expects to get full PC hardware access privileges and thus some
+ datastructures do not get initialized by it (need to be trapped later at
+ runtime stage). Some of the missing initializations are solved by
+ <a href="#functype_wrap">API functions wrapping</a>.
+
+ <p>pros: Lightweight, easier to debug.</p>
+
+ <p>cons: Possible incompatible emulation of
+ <span class="fname">ntoskrnl.exe</span> parts, missing documentation needed
+ for the implementation.</p>
+
+ <h2>Filesystem Driver Inside Virtual Address Space</h2>
+
+ <p>Unlike <a href="#method_ntoskrnl">previous method</a> here we do not use
+ even <span class="fname">ntoskrnl.exe</span> as the complete kernel part of
+ W32 is <a name="native_ntoskrnl">emulated from the project source
+ files</a>. <span class="fname">cdfs.sys</span> driver was successfuly ran
+ in this manner in the former versions of this project but the possibility
+ to run without <span class="fname">ntoskrnl.exe</span> was dropped since it
+ had no licensing gains (you need the original
+ <span class="productname">Microsoft Windows NT</span> files at least for
+ the filesystem driver itself) and the emulation of undocumented parts
+ reusable from <span class="fname">ntoskrnl.exe</span> binary was
+ a pain.</p>
+
+ <p>pros: Lightweight, easier to debug.</p>
+
+ <p>cons: Possible incompatible emulation of the whole
+ <span class="fname">ntoskrnl.exe</span>, its missing documentation.</p>
+
+
+<h1>Implementation Details</h1>
+
+ <a name="functype"><h2>API Function Implementation Choices</h2></a>
+
+ <p>For each function exported by W32
+ <span class="fname">ntoskrnl.exe</span> and imported and called by the
+ filesystem driver a decision needs to be made to properly implement its
+ functionality. Currently implemented functionality statistics are provided
+ below:</p>
+
+ <FIXME:numbers>
+ <table border="1" align="center">
+ <tr><th>Function type </th><th>Items</th><th>Portion</th></tr>
+ <tr><td><a href="#functype_pass">pass</a> </td><td> 46</td><td> 21%</td></tr>
+ <tr><td><a href="#functype_wrap">wrap</a> </td><td> 1</td><td> 0%</td></tr>
+ <tr><td><a href="#functype_native_reactos">native-ReactOS</a></td><td> 94</td><td> 43%</td></tr>
+ <tr><td><a href="#functype_native_libcaptive">native-own</a> </td><td> 79</td><td> 36%</td></tr>
+ <caption>Function Implementation Types Statistics</caption>
+ </table>
+
+ <p>As there are several choices to implement each function the usual
+ attempts/investigations ordering is listed in the sections below.</p>
+
+ <p>Special case must be taken for data-type symbols since they are
+ referenced without the possibility of catching the code flow by some
+ breakpoints (it would be possible only in some special access cases). Data
+ export symbols of <span class="constant">unpatched</span> libraries must
+ contain already prepared content at the runtime. There is a problem
+ with <span class="constant">patched</span> libraries where it is necessary
+ to also fully implement the data symbol as
+ <a href="#functype_native">native implementation</a> since there is no
+ possibility to <a href="#functype_pass">pass</a> the data symbol instead of
+ the original W32 data location and therefore there will be two instances of
+ such data variable place. As there will be also the uncaught references for
+ such W32 data location from the <span class="constant">patched</span>
+ library itself such symbols should be usually only some constants (such as
+ <span class="constant">KeNumberProcessors</span>).</p>
+
+ <p>W32 platform symbols export/import can be based either on the symbol
+ name itself or it can be also exported and imported just by its
+ identification number called <span class="constant">Ordinal</span>.
+ Although it saves some jumptables file binary size it is currently no
+ longer used by W32 binaries and this project also does not support such
+ <span class="constant">Ordinal</span> symbol reference type at all.</p>
+
+ <p>All the exporting magic is handled by custom script
+ <span class="fname">captivesym</span> processing the definition file
+ <FIXME:span class="fname">src/libcaptive/ke/exports.captivesym</span> to produce
+ the intermediate relaying code
+ <FIXME:span class="fname">src/libcaptive/ke/exports.c</span>. For details of the
+ <span class="fname">captivesym</span>-specific source file syntax please
+ see its documentation: <FIXME:span class="fname">doc/captivesym-pod.html</span>
+
+ <a name="functype_pass"><h3>Direct Pass to Original "ntoskrnl.exe"</h3></a>
+
+ <p>Simple (standalone) functions such as
+ <span class="function">RtlTimeToSecondsSince1970()</span> can be simply
+ passed to the original implementation in
+ <span class="fname">ntoskrnl.exe</span> as they make no hardware access
+ and they do not expect any special internal data structures to be set up
+ in advance by an earlier library initialization. A common case are all
+ the data structures utility functions such as
+ <span class="constant">GenericTable</span> subsystem or
+ <span class="constant">LargeMcb</span> handling.</p>
+
+ <a name="functype_pass_fromunix"><h4>Pass from UNIX Code</h4></a>
+
+ <p>Control flow begins in some standard UNIX code. Such code is always
+ using <a href="#calltype_cdecl">cdecl call type</a> for all its
+ intracalls. <a href="#functype_native_reactos">Native functions
+ compiled from <span class="productname">ReactOS</span> sources</a> use
+ their own <a href="#calltype">cdecl/stdcall/fastcall</a> declarations
+ but these call type modifications are discarded during compilation for
+ this project by the <span class="constant">LIBCAPTIVE</span>
+ symbol.</p>
+
+ <p>UNIX code calls <span class="function">FUNCTIONNAME()</span> relay
+ from the generated UNIX jump table. Such relay will debug dump the
+ passed arguments and finally pass the control to the original W32
+ function code in the proper call type
+ <a href="#calltype">cdecl/stdcall/fastcall</a> for a given
+ function.</p>
+
+ <p>Original W32 code entry point is always trapped by a breakpoint
+ although it would not be needed during this specific direct pass from
+ UNIX code to the original W32 implementation. Still the breakpoint has
+ to be there to catch some other (such as intra-W32) possible calls
+ described later. There are several more ways to define breakpoint in
+ the code. One way is to use processor hardware breakpoint support but
+ the number of breakpoints is limited. The other way is to patch in the
+ <span class="instruction">@{[ 'int $3' ]}</span> instruction but it will invoke
+ <span class="constant">SIGTRAP</span> signal handler conflicting with
+ the possible debugger (<span class="productname">gdb(1)</span>)
+ control. This project uses the <span class="instruction">hlt</span>
+ instruction, which also has a single-byte opcode as
+ <span class="instruction">@{[ 'int $3' ]}</span> and it is a privileged
+ instruction forbidden to be used from the UNIX user space code.
+ <span class="instruction">hlt</span> invokes
+ <span class="constant">SIGSEGV</span> signal which can be resolved by
+ a custom signal handler without any conflict with the possible
+ debugger control; <span class="productname">gdb(1)</span> needs the
+ following command to pass through such
+ <span class="constant">SIGSEGV</span> signal:</p>
+
+ <blockquote class="command">
+ <p>handle SIGSEGV nostop noprint pass</p>
+ </blockquote>
+
+ <p>When a breakpoint gets caught, we usually need to return to the
+ running code. Unfortunately it is not possible because of the patched
+ breakpoint opcode. The breakpoint cannot be simply removed upon return
+ as it would permanently loose control over the point of entry. Even if
+ the return would include faking of the return address in the bottom
+ stack frame to patch the breakpoint back during later function exit it
+ still would not solve the caughts of inner calls of recursive
+ functions. One of the working possibilities would be to patch the
+ original instruction back and perform a singlestep provided by
+ <span class="function">ptrace(2)</span> syscall. However such
+ singlestep needs another controlling UNIX process and it would again
+ conflict with the debuggers such as
+ <span class="productname">gdb(1)</span>. This project implements the
+ singlestep functionality by two consecutive breakpoints
+ (<span class="instruction">hlt</span> instructions to be specific):
+ The first two instruction addresses of the W32 functions are called
+ <span class="productname">slot #1</span> and
+ <span class="productname">slot #2</span>, the length of the first
+ function instruction has to be analyzed to get the right address of
+ <span class="productname">slot #2</span>. When the first breakpoint is
+ caught it is necessary to patch the original instruction back and also
+ patch another breakpoint in place of
+ <span class="productname">slot #2</span>.
+ During the <span class="productname">slot #2</span> breakpoint
+ invocation the operation will be reverted - the breakpoint will be put
+ to <span class="productname">slot #1</span> again and the instruction
+ of <span class="productname">slot #2</span> will be restored to be able
+ to continue the execution of the function.</p>
+
+ <p>W32 function will finish in its specific
+ <a href="#calltype">cdecl/stdcall/fastcall call type</a>, the control
+ will return to the UNIX jump table relay which will debug dump the
+ return value and it will finally pass the control back to the UNIX
+ caller in the standard UNIX
+ <a href="#calltype_cdecl">cdecl call type</a>.</p>
+
+ @{[ doc_img 'fig/functype_patched_pass_fromunix',
+ 'Function Type: <span class="constant">pass</span> from UNIX Code' ]}
+
+ <a name="functype_pass_fromw32"><h4>Pass from W32 Code</h4></a>
+
+ <p>This function type is similiar to the
+ <a href="#functype_pass_fromunix">previous one</a> with the exception
+ of more complicated entry point. Unfortunately W32 libraries call their
+ own functions directly, using the <span class="instruction">call</span>
+ instructions without any patchable jump table. Even the
+ <span class="instruction">call</span> argument itself cannot be patched
+ according to the relocation table record as such library intra-call
+ instruction has no relocation due to its relative argument offset on
+ <span class="constant">i386</span>. This time the double-breakpoint
+ mechanism <a href="#functype_pass_fromunix">described above</a> gets
+ handy since it will catch the entry point when the function gets
+ called. <span class="constant">SIGSEGV</span> handler gets invoked by
+ the <span class="instruction">hlt</span> instruction and it will
+ redirect the control to the jump table relay function to debug dump the
+ function entry arguments (it has no other uses in this call type).</p>
+
+ <p>When the relay needs to call the original function it will reach
+ exactly the same breakpoint instruction as during the recent
+ <span class="constant">SIGSEGV</span> handling redirecting to this
+ calling relay. But this time the
+ <span class="constant">through_w32_func</span> field of this function
+ record will be set to to prevent repeated redirection and to pass the
+ control through the breakpoint mangle instead this time.</p>
+
+ <p>Returning is not much interesting as the first
+ <span class="constant">SIGSEGV</span> handler did a straight jump
+ for the redirection purposes without any needed consequent
+ handling.</p>
+
+ <p>The jump table relay used for the callers from W32 code is
+ a different one than the relay being used for the callers
+ <a href="#functype_pass_fromunix">from UNIX code</a>. UNIX code always
+ uses relay with external <a href="#calltype_cdecl">cdecl call type</a>
+ but in this case a relay with the appropriate
+ <a href="#calltype">cdecl/stdcall/fastcall call type</a> is used.</p>
+
+ @{[ doc_img 'fig/functype_patched_pass_fromw32',
+ 'Function Type: <span class="constant">pass</span> from W32 Code' ]}
+
+ @{[ vskip() ]}
+
+ <table border="1" align="center">
+ <tr><td><span class="fname">captivesym</span> keyword</td><td>pass</td></tr>
+ <tr><td>Native code function name </td><td>(no implementation)</td></tr>
+ <tr><td>W32 traced code from UNIX function name </td><td>FUNCNAME</td></tr>
+ <tr><td>W32 traced code from W32 function name </td><td>FUNCNAME_cdecl/_stdcall/_fastcall</td></tr>
+ <tr><td>Entry/exit debug tracing from UNIX code </td><td>yes</td></tr>
+ <tr><td>Entry/exit debug tracing from W32 code </td><td>yes</td></tr>
+ <caption>Function Type <span class="constant">pass</span> Characteristics</caption>
+ </table>
+
+ <a name="functype_wrap"><h3>Wrap of the Original "ntoskrnl.exe" Function</h3></a>
+
+ <a name="functype_wrap_fromunix"><h4>Wrapping of Call from UNIX Code</h4></a>
+
+ <p>The code control flow has no special hardcore features since it is
+ very similiar to <a href="#functype_pass_fromunix">the direct pass to
+ W32 function from UNIX code</a>. All the wrapping is done in the
+ standard UNIX <a href="#calltype_cdecl">cdecl call type</a> manner.
+ Jump table debug dumping relays are provided twice - the
+ "outer" one to trace the parameters from the function caller
+ and the "inner" one to trace the call from the wrapper to the
+ original W32 code. The "inner" relay also calls the W32 code
+ with the appropriate <a href="#calltype">cdecl/stdcall/fastcall call
+ type</a>.</p>
+
+ @{[ doc_img 'fig/functype_patched_wrap_fromunix',
+ 'Function Type: <span class="constant">wrap</span> from UNIX Code' ]}
+
+ <a name="functype_wrap_fromw32"><h4>Wrapping of Call from W32 Code</h4></a>
+
+ <p>This scheme is a combination of the
+ <a href="#functype_wrap_fromunix">previous wrap of a call from
+ UNIX code</a> and the <a href="#functype_pass_fromw32">direct pass from
+ the W32 code</a>. The control is caught and redirected by
+ <span class="constant">SIGSEGV</span> handler from the breakpoint
+ placed at the entry to the original W32 function code. The second entry
+ to the original W32 function with the
+ <span class="constant">through_w32_func</span> field of this function
+ description already set is done from the "inner" jump table
+ relay with the appropriate
+ <a href="#calltype">cdecl/stdcall/fastcall call type</a>.</p>
+
+ @{[ doc_img 'fig/functype_patched_wrap_fromw32',
+ 'Function Type: <span class="constant">wrap</span> from W32 Code' ]}
+
+ @{[ vskip() ]}
+
+ <p>Some functions can be <a href="#functype_pass">passed to the original
+ code</a> but they need their parameters to be checked/prepared.
+ Currently, such wrapping is only needed for the
+ <span class="function">ExAllocateFromPagedLookasideList()</span> function
+ where it is required due to <a href="#init_ntoskrnl">missing execution of
+ <span class="fname">ntoskrnl.exe</span> initialization execution</a>,
+ which would otherwise properly initialize some internal data structures.
+ In this case the wrapping code detects passing of an uninitialized
+ parameter and will search through the whole
+ <span class="fname">ntoskrnl.exe</span> code body at runtime to find the
+ proper initialization routine containing the correct initialization
+ parameters. Passed addresses of static structures must be differentiated
+ as each of them usually has different initialization parameters. It is
+ proactive to not to have fixed parameters array as these parameters may
+ differ across different <span class="fname">ntoskrnl.exe</span>
+ versions.</p>
+
+ <table border="1" align="center">
+ <tr><td><span class="fname">captivesym</span> keyword</td><td>wrap</td></tr>
+ <tr><td>Native UNIX wrapping code function name </td><td>FUNCNAME_wrap</td></tr>
+ <tr><td>W32 traced wraping code from UNIX func. name </td><td>FUNCNAME</td></tr>
+ <tr><td>W32 traced wrapping code from W32 func. name </td><td>FUNCNAME_cdecl/_stdcall/...</td></tr>
+ <tr><td>W32 traced original code function name </td><td>FUNCNAME_orig</td></tr>
+ <tr><td>Entry/exit debug tracing from UNIX code </td><td>yes</td></tr>
+ <tr><td>Entry/exit debug tracing from W32 code </td><td>yes</td></tr>
+ <caption>Function Type <span class="constant">wrap</span> Characteristics</caption>
+ </table>
+
+ <a name="functype_native"><h3>Native Implementation</h3></a>
+
+ <h4>Native Implementation Called from UNIX Code</h4>
+
+ <p>This is the simplest case of a function call as it is fully
+ handled only by the compiler and/or linker.</p>
+
+ <p>In this case though, no debug dumping call relay is provided - such
+ relay would need to rename the implementations of native functions to
+ prevent its automatic linking with the caller code. This renaming would
+ not be possible to do by simple <span class="constant">#define</span>
+ since it would also rename any calling statements of such function in
+ the same C sources. One of the possibilities to solve would be to
+ utilize <span class="dashdash">--redefine-sym</span> feature of the
+ <span class="productname">objcopy(1)</span> utility. On the other hand
+ there is not much need to catch/debug such calls as both the caller and
+ the callee are provided with full source file debug information for the
+ debugger. Also the callee usually debug dumps its entry/exit parameters
+ by custom debug dumps in the
+ <a href="#functype_native_reactos"><span class="productname">ReactOS</span> implementations</a>.
+
+ @{[ doc_img 'fig/functype_native_fromunix',
+ 'Function Type: <span class="constant">native</span> from UNIX Code' ]}
+
+ <a name="functype_native_fromw32"><h4>Native Implementation of
+ "unpatched" Library Function Called from W32 Code</h4></a>
+
+ @{[ doc_img 'fig/functype_unpatched_native_fromw32',
+ 'Function Type: <span class="constant">native</span> of <span class="constant">unpatched</span> from W32 Code' ]}
+
+ <p>Here comes the differentiation if the project deals either with
+ a <span class="constant">patched</span> or an
+ <span class="constant">unpatched</span> version of the library
+ (<span class="constant">patched</span> is a loaded W32 binary
+ library while <span class="constant">unpatched</span> library is
+ completely provided by this project with no use of the library's
+ original W32 binary file). As the project adjusts the exported symbol
+ address during the patching operation, in some cases the
+ <span class="constant">patched</span> library call may be handled
+ simply as <span class="constant">unpatched</span> library call even for
+ the <span class="constant">patched</span> libraries. Fortunately the
+ distinction is not much important as the project is prepared to
+ properly handle both cases.</p>
+
+ <p>The W32 caller which imported the symbol will be pointed right to
+ the relaying function. The debug dumping relay will be called from W32
+ code with the appropriate
+ <a href="#calltype">cdecl/stdcall/fastcall call type</a> while the
+ relay will call the implementation of the native function in the
+ standard UNIX <a href="#calltype_cdecl">cdecl call type</a> manner.</p>
+
+ <h4>Native Implementation of "patched" Library Function Called from W32 Code</h4>
+
+ @{[ doc_img 'fig/functype_patched_native_fromw32',
+ 'Function Type: <span class="constant">native</span> of <span class="constant">patched</span> from W32 Code' ]}
+
+ <p>The calling scheme is similiar to the
+ <a href="#functype_native_fromw32">previous call of
+ <span class="constant">unpatched</span> library function from W32
+ code</a> but the call control is redirected from the entry point of the
+ original W32 binary implementation by the breakpoint and its
+ <span class="constant">SIGSEGV</span> handler as in
+ <a href="#functype_pass_fromw32">the case of passing control from W32
+ call</a>.</p>
+
+ <p>The original W32 function implementation located in the original
+ loaded binary file is never executed but its entry point needs to be
+ trapped by the breakpoint to be able to catch the function calls within
+ the library.</p>
+
+ @{[ vskip() ]}
+
+ <p>In all cases the final function implementation is a standard UNIX
+ code compiled from C sources with full debug information available
+ for the debugger. Fortunately all such functions do not need to be coded
+ from scratch for this project since there already exist $freespeech
+ $ReactOS and $Wine projects and their code can be used instead.</p>
+
+ <p>$Wine project is listed mostly for a completeness as almost no
+ code was suitable for reuse as it implements W32 user space while this
+ project is running pure W32 kernel space environment (in $gnulinux user
+ space!).</p>
+
+ <a name="functype_native_reactos"><h4>Native Implementation
+ - <span class="productname">ReactOS</span></h4></a>
+
+ <p>Some functions are already implemented in the $ReactOS
+ project and they can be used as they are. Although it would be
+ possible to <a href="#functype_pass">pass some function calls to the
+ original code</a> it is more handy to provide native implementation as
+ there is better control of the data handling during debugging sessions
+ due to the provided debugging symbols.</p>
+
+ <p>Such functions can be found in
+ <span class="fname">src/libcaptive/reactos/</span> subdirectory.
+ Some functions had to be adjusted for this project
+ - these modifications are compiled conditionally, depending on the
+ <span class="constant">LIBCAPTIVE</span> symbol existence.</p>
+
+ <p>Later stages of this project reached the level where
+ $ReactOS is yet too immature and the needed functions are usually
+ written just with the sad body:</p>
+
+ <blockquote class="command">
+ <p>UNIMPLEMENTED;</p>
+ </blockquote>
+
+ <p>Functions that were not possible to
+ <a href="#functype_pass">pass</a> were reimplemented by this project
+ and placed in the project's implementation directories
+ <a href="#reactos_nocare">instead of extending</a> $ReactOS code.</p>
+
+ <a name="functype_native_wine"><h4>Native Implementation -- <span class="productname">Wine</span></h4></a>
+
+ <p>Even though $Wine only implements the
+ <span class="productname">Microsoft Windows NT</span> user space, there
+ still are some common functions which could be copied from the $Wine
+ project.</p>
+
+ <a name="functype_native_libcaptive"><h4>Native Implementation - Project Specific</h4></a>
+
+ <p>As the last resort it was necessary to provide completely own
+ implementation of some API functions such as PC hardware dependent
+ parts or memory management functions.</p>
+
+ @{[ vskip() ]}
+
+ <table border="1" align="center">
+ <tr><td><span class="fname">captivesym</span> keyword</td><td>(none; just the symbol name)</td></tr>
+ <tr><td>Native code function name </td><td>FUNCTIONNAME</td></tr>
+ <tr><td>Native traced code from W32 code func. name </td><td>FUNCTIONNAME_cdecl/_std...</td></tr>
+ <tr><td>Entry/exit debug tracing from UNIX code </td><td>no</td></tr>
+ <tr><td>Entry/exit debug tracing from W32 code </td><td>yes</td></tr>
+ <caption>Function Type <span class="constant">native</span> Characteristics</caption>
+ </table>
+
+ <a name="functype_undef"><h3>Undefined Function</h3></a>
+
+ <p>Functions not defined by any of the previous function types cannot be
+ called by any W32 code including the code of the library implementing
+ such function. All functions of <span class="constant">patch</span>ed
+ libraries not listed in the <span class="fname">captivesym</span> exports
+ file are automatically set to be trapped as fatal program execution
+ errors.</p>
+
+ <p>It is not necessary to list the symbols as
+ <span class="constant">undef</span> as long as you are just loading the
+ W32 <span class="constant">PE-32</span> code and the symbols belong to
+ <span class="constant">patch</span>ed library. On the other hand if you
+ are loading W32 <span class="fname">.so</span> code or if such symbol is
+ a part of <span class="constant">unpatched</span> library (and thus
+ being completely provided by the project) you need to list such symbol as
+ <span class="constant">undef</span> type to prevent unresolved symbol
+ reference.</p>
+
+ <table border="1" align="center">
+ <tr><td><span class="fname">captivesym</span> keyword</td><td>undef</td></tr>
+ <tr><td>Native code function name </td><td>(no implementation)</td></tr>
+ <tr><td>Native traced code function name </td><td>FUNCTIONNAME_cdecl/_stdcall/_fastcall</td></tr>
+ <tr><td>Debug tracing message from UNIX code </td><td>yes</td></tr>
+ <tr><td>Debug tracing message from W32 code </td><td>yes</td></tr>
+ <caption>Function Type <span class="constant">undef</span> Characteristics</caption>
+ </table>
+
+
+ <a name="calltype"><h2>API Function Calling Conventions</h2></a>
+
+ <p>Standard UNIX code compiled by GCC (GNU C Compiler) running on host
+ $gnulinux always uses <a href="#calltype_cdecl">cdecl</a> ABI (Application
+ Binary Interface) calling convention. This calling convention is also the
+ default declaration type of UNIX functions.</p>
+
+ <p>W32 uses three different calling conventions in its ABI. They are all
+ described in the
+ <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_core_argument_passing_and_naming_conventions.asp"><span class="productname">Microsoft</span> documentation</a>.
+ There is always necessary to have the proper function declaration
+ (prototype) in the caller scope to prevent all sorts of unexpected
+ crashes.</p>
+
+ <p>Unfortunately some non-matching combinations of calling conventions
+ result in hard to debug bugs: the caller gets back an unexpected stack
+ pointer from the callee and upon return it will restore registers from the
+ wrong stack pointer place. Since the caller will finally reclaim its stack
+ frame from its (uncorrupted) <span class="constant">EBP</span> stack frame
+ pointer the caller will return to the caller of the caller correctly. Just
+ the registers remain corrupted causing crashes of completely unrelated code
+ executed far, far away...</p>
+
+ <p><span class="constant">EDI</span>, <span class="constant">ESI</span> and
+ <span class="constant">EBX</span> registers are always saved on the stack.
+ They are stored on the stack in this particular order from bottom to top
+ addresses (using the <span class="instruction">push EBX</span>,
+ <span class="instruction">push ESI</span>,
+ <span class="instruction">push EDI</span> sequence). Fortunately $gnulinux
+ GCC has the same register saving behaviour. If some register corruption
+ occurs the calling type presented between the caller and callee should be
+ checked.</p>
+
+ <a name="calltype_cdecl"><h3>W32 Calling Convention "cdecl"</h3></a>
+
+ <p>The only calling convention in the UNIX world. The default one for all
+ the compilers. All the arguments are passed on the stack, no arguments
+ are cleaned by the callee. Possible inconsistencies in the number of
+ function arguments with the function prototype used by the caller is
+ harmless. Variable arguments lists can be passed by this convention.</p>
+
+ @{[ doc_img 'fig/calltype_cdecl',
+ 'W32 Calling Convention <span class="constant">cdecl</span> Scheme' ]}
+
+ <table border="1" align="center">
+ <tr><td>Arguments freed by </td><td>caller</td></tr>
+ <tr><td>Arguments on the stack </td><td>#0 ... #(n-1)</td></tr>
+ <tr><td>Arguments in the registers </td><td>none</td></tr>
+ <tr><td>GCC attribute </td><td><span class="command">__attribute__((__cdecl__))</span> (default)</td></tr>
+ <caption>Calling Convention <span class="constant">cdecl</span> Characteristics</caption>
+ </table>
+
+ <h3>W32 Calling Convention "stdcall"</h3>
+
+ @{[ doc_img 'fig/calltype_stdcall',
+ 'W32 Calling Convention <span class="constant">stdcall</span> Scheme' ]}
+
+ <p>Convention never used in the UNIX world. It needs to be specified for
+ W32 compilers. All the arguments are passed on the stack, all the
+ arguments are cleaned by the callee. Possible inconsistencies in the
+ number of function arguments with the function prototype used by the
+ caller will result in fatal crash. Variable arguments lists cannot be
+ passed by this convention - use <a href="#calltype_cdecl">cdecl</a>
+ instead.</p>
+
+ <table border="1" align="center">
+ <tr><td>Arguments freed by </td><td>callee</td></tr>
+ <tr><td>Arguments on the stack </td><td>#0 ... #(n-1)</td></tr>
+ <tr><td>Arguments in the registers </td><td>none</td></tr>
+ <tr><td>GCC attribute </td><td><span class="command">__attribute__((__stdcall__))</span></td></tr>
+ <caption>Calling Convention <span class="constant">stdcall</span> Characteristics</caption>
+ </table>
+
+ <h3>W32 Calling Convention "fastcall"</h3>
+
+ <p>Convention never used in the UNIX world. It needs to be specified for
+ W32 compilers. Convention used in the W32 world for its low calling
+ overhead. All but the first two arguments are passed on the stack, such
+ arguments are cleaned by the callee. First two arguments are passed in
+ the registers <span class="constant">ECX</span> and
+ <span class="constant">EDX</span> respectively. Possible inconsistencies
+ in the number of function arguments with the function prototype used by
+ the caller will result in fatal crash. Variable arguments lists cannot be
+ passed by this convention - use <a href="#calltype_cdecl">cdecl</a>
+ instead.</p>
+
+ <p>GCC (GNU C Compiler) native support for this calling convention
+ is pretty fresh and it is currently present only in the recent CVS
+ versions since 21st December of 2002 which should get released as GCC
+ version 3.4. This project solved the unsupported calling convention by
+ declaration of arguments passed in registers by
+ <span class="command">__attribute__((__regparm__(3)))</span>.
+ W32 passes the arguments in registers in the order
+ <span class="constant">ECX</span>, <span class="constant">EDX</span> but
+ GCC passes them in registers <span class="constant">EAX</span>,
+ <span class="constant">EDX</span>, <span class="constant">ECX</span>.
+ This incompatibility is compensated at C source level in the
+ <a href="#functype">relaying code</a> generated by
+ <span class="fname">captivesym</span> relay generator.</p>
+
+ @{[ doc_img 'fig/calltype_fastcall',
+ 'W32 Calling Convention <span class="constant">fastcall</span> Scheme' ]}
+
+ <table border="1" align="center">
+ <tr><td>Arguments freed by </td><td>callee</td></tr>
+ <tr><td>Arguments on the stack </td><td>#2 ... #(n-1)</td></tr>
+ <tr><td>Arguments in the registers </td><td><span class="constant">ECX</span>=#0,
+ <span class="constant">EDX</span>=#1</td></tr>
+ <tr><td>GCC ≥3.4 attribute </td><td><span class="command">__attribute__((__fastcall__))</span></td></tr>
+ <tr><td>GCC <3.4 attr. emulation</td><td><span class="command">__attribute__((__stdcall__))</span></td></tr>
+ <tr><td> </td><td><span class="command">__attribute__((__regparm__(3) /* EAX,EDX,ECX */))</span></td></tr>
+ <caption>Calling Convention <span class="constant">fastcall</span> Characteristics</caption>
+ </table>
+
+ <a name="synchronous"><h2>Multithreading and Multiple Processors</h2></a>
+
+ <p>W32 platform stands on its thorough architecture parallelism. It
+ must lock all its objects to maintain coherence in presence of
+ multithreading and multiple processors. Since the author of this project
+ considers any parallel execution a serious obstacle for debugging the whole
+ project architecture was designed to prevent any undeterministic behaviour.
+ Therefore this projects always emulates uniprocessor
+ <span class="productname">Microsoft Windows NT</span> kernel
+ (<span class="constant">KeNumberProcessors</span> symbol is always 1),
+ everything runs in the single initial thread/process and all the filesystem
+ operations are performed as synchronous
+ ("synchronous" by flags
+ <span class="constant">FILE_SYNCHRONOUS_IO_ALERT</span>,
+ <span class="constant">FO_SYNCHRONOUS_IO</span>,
+ <span class="constant">IRP_SYNCHRONOUS_API</span>,
+ <span class="constant">IRP_SYNCHRONOUS_PAGING_IO</span>,
+ forced <span class="constant">TRUE</span> result of
+ <span class="function">IoIsOperationSynchronous()</span>
+ etc.).
+ <span class="constant">STATUS_PENDING</span> result code indicating that
+ request should be completed in the next callback of the driver is
+ considered <a href="#paranoia">fatal</a> as it should not happen for the
+ requested synchronous <span class="constant">IRP</span>s (I/O Request
+ Packets). Since there is a possibility some filesystem would require
+ a real W32 parallel thread all the code that would be hit by W32
+ multithreading capability is marked by
+ <span class="constant">TODO:thread</span> comment for a possible
+ future extension.</p>
+
+ <p>Multiple processors (SMP) support will never need to be implemented
+ since uniprocessor W32 kernels apparently run the filesystem driver modules
+ fine. As this project implements only the uniprocessor W32 kernel all the
+ processor locking functions and structures such as
+ <span class="constant">KSPIN_LOCK</span> etc. can be safely implemented as
+ no-operations.</p>
+
+ <p>Asynchronous callbacks registered for
+ <span class="constant">IO_WORKITEM</span>s are passed as GLib idle
+ functions by <span class="function">g_idle_add_full()</span>. Although they
+ will probably never be executed during non-interactive project's batch
+ executions it is the responsibility of W32 driver implementation to
+ complete all the pending tasks before its W32 shutdown. Such W32 shutdown
+ is done during cleanup of the project's execution by
+ <span class="function">captive_shutdown()</span>.</p>
+
+ <a name="paranoia"><h2>Paranoia Checks</h2></a>
+
+ <p>A general approach of software projects development is to implement
+ many internal sanity checks during the development stage but to produce the
+ most optimized final release product without those debugging checks.</p>
+
+ <p>Facilities for these practices can be seen in the standard
+ C include files for example as function
+ <span class="function">assert()</span> which gets disabled by the
+ <span class="constant">NDEBUG</span> symbol used during the final optimized
+ executable compilation. This project uses Gnome GLib messaging subsystem
+ offering sanity checks discarded by symbols
+ <span class="constant">G_DISABLE_ASSERT</span> and
+ <span class="constant">G_DISABLE_CHECKS</span>.
+ <span class="productname">Microsoft</span> also produces two versions of
+ its products - regular customers use the "free build" (also
+ called "retail") while the programmers should develop their code
+ on the "checked build" product releases.</p>
+
+ <p>As this project will always run unknown binary code of proprietary W32
+ filesystem drivers, the code can never be trusted. Such code even runs in
+ the same unprotected address space as its controlling UNIX code. Since
+ there is not enough documentation for the W32 components of the system and
+ also such documentation is usually misleading it can never be considered as
+ 100% emulation. Even in the final releases all the sanity checks
+ implemented in this project should remain active as all the project's code
+ always interacts with unknown and untrusted W32 binaries.</p>
+
+ <p><span class="productname">Microsoft Windows NT</span> code is written in
+ a foolproof style as it accepts even invalid input values, and which
+ it usually corrects. This makes long-term debugging a pain as it hides
+ sources of problems. "Checked build" releases were probably
+ designed to fix this flaw by strict consistency checks but it did not reach
+ its goals as such checks are usually missing in the code.</p>
+
+ <p>This project has strict consistency checks across all the code to make
+ the debugging phase easy enough. Failed sanity check is not always
+ a bug - sometimes it just means the real W32 binary code is more
+ benevolent than it could be expected according to the documentation and
+ such sanity check gets removed for the next version build. In other cases
+ the failed sanity checks mean the execution path for some unexpected
+ arguments combination was not yet implemented by this project. I may also
+ mean a bug, of course...</p>
+
+ <p>Last but not least - never miss a possible sanity check as its
+ later removal is in an order of magnitude cheaper than an uncaught
+ invalid assumption. Failed assertion is not always a bug although it
+ has to be fixed, of course.</p>
+
+ <a name="client_interface"><h2>Client Filesystem Interface</h2></a>
+
+ <p>While this project successfuly communicates with the W32 filesystem
+ driver (considered as the lower layer) it must also somehow offer its open
+ filesystem interface service to some real client software (upper layer).
+ This project offers its own custom filesystem operations interface of <span
+ class="constant">libcaptive</span> library based on GLib
+ <span class="constant">GObject</span> OO system. Interface prototypes are
+ specified in the project's <span class="fname">client-*.h</span>
+ include files.</p>
+
+ <p>The filesystem service can be offered in several ways:</p>
+
+ <ul>
+ <li>
+ <p>One possibility would be to write
+ <a name="client_interface_customapp">a custom client application</a>
+ for this project such as file manager or a shell. Although it
+ would implement the most appropriate user interface to the set of
+ functions offered by this project (and W32 filesystem API) it has the
+ disadvantage of special client software. Appropriate client is provided
+ by this project as:
+ <span class="fname">src/client/cmdline/cmdline-captive</span></p>
+ </li>
+ <li>
+ <p>The real UNIX OS filesystem implementation must be completely
+ implemented inside the hosting OS kernel. This requires special coding
+ methods with limited availability of coding features and libraries.
+ Also it would give the full system control to the untrusted W32
+ filesystem driver code with possibly fatal consequences of yet
+ unhandled W32 emulation code paths. It would benefit from the best
+ execution performance but this solution was never considered a real
+ possibility.</p>
+ </li>
+ <li>
+ <p>The common approach
+ <a name="offered_NFS">of filesystem implementations</a>
+ outside UNIX OS kernel were custom NFS servers usually running on the
+ same machine as the NFS-connected client as such NFS server is usually
+ an ordinary UNIX user space process. It would be possible to implement
+ this project as a custom NFS server but the NFS protocol itself
+ has a lot of fundamental flaws and complicated code for backward
+ compatibility.</p>
+ </li>
+ <li>
+ <p>Currently there is already implemented
+ <a name="offered_gnomevfs"><a href="#offered_gnomevfs_todo">Gnome-VFS interface</a></a>
+ to the custom filesystem interface of this project's library <span
+ class="constant">libcaptive</span>.
+ The $GnomeVFSmodule can be used by a Gnome-VFS aware client (such
+ as <span class="fname">gnome-vfs/tests/test-shell</span>).</p>
+
+ <FIXME:lufs-gvfs>
+ <p>The <span class="productname">Gnome-VFS-module</span> can be further
+ utilized by the <span class="productname">UserVFS</span>
+ \bookcitation{UserVFS-2.0} software ported to provide local <span
+ class="productname">Coda</span> \bookcitation{Coda} network filesystem
+ server implementation similar to the <a href="#offered_NFS">NFS
+ server</a> solution but with much more acceptable network protocol ---
+ more about this actual scheme can be found in \link{architecture}{the
+ project architecture description}.</p>
+ </li>
+ <li>
+ <FIXME:LUFS>
+ <p>Direct interface for the Host-OS kernel would be provided
+ by the
+ \label{fuse_interface}
+ <span class="productname">FUSE</span> \bookcitation{FUSE} project \link{offered_FUSE}{described
+ later in this document}. This interface is currently not yet implemented.
+ Although it would be much more straightforward than
+ <a href="#offered_gnomevfs">Gnome-VFS interface</a> described above,
+ its biggest disadvantage would be the requirement to replace/update
+ the stock distributions kernel package as it usually does not
+ have the <span class="productname">FUSE</span> \bookcitation{FUSE} filesystem support while it already supports
+ the <span class="productname">Coda</span> \bookcitation{Coda} interface, which is sufficient for the
+ ported <span class="productname">UserVFS</span> \bookcitation{UserVFS-2.0} interface.</p>
+ </li>
+ </ul>
+
+ <h2>3rd Party Projects Bugfixes</h2>
+
+ <p>Implementation of this project required certain bugfixes to 3rd party
+ software packages:</p>
+
+ <h3>GNU Libtool, A Generic Library Support Script</h3>
+
+ <p><span class="productname"><a href="http://www.gnu.org/software/libtool/">libtool</a></span>:
+ Handle duplicate object file names when performing piecewise archive
+ linking by renaming object files when needed.</p>
+
+ <h3>dosfstools, MS-DOS FAT Filesystems Support on Linux</h3>
+
+ <p><span class="productname"><a href="ftp://ftp.uni-erlangen.de/pub/Linux/LOCAL/dosfstools/">dosfstools</a></span>:
+ Prevent generation of <span class="constant">FAT-32</span> filesystems
+ not supported by the (buggy?) W32 platform
+ <span class="fname">fastfat.sys</span> implementation.</p>
+
+ <h3>ext2fsd, Ext2 File System Driver</h3>
+
+ <p><span class="productname"><a href="http://sys.xiloo.com/projects/projects.htm#ext2fsd">Ext2fsd</a></span>:
+ Many filesystem corruption fixes, missing filesystem unregistration
+ etc.</p>
+
+
+<h1>Futher Development</h1>
+
+ <p>All the W32 filesystem operations of <span class="fname">cdfs.sys</span>,
+ <span class="fname">fastfat.sys</span>
+ and
+ <span class="fname">ext2fsd.sys</span> can be successfuly executed.
+ The further development tasks include:</p>
+
+ <ul>
+ <li>
+ <p>The primary goal is to reach <span class="productname">NTFS</span>
+ filesystem (<span class="fname">ntfs.sys</span>) compatibility.
+ A lot of imported symbols is missing although it is expected most of
+ them can be just safely passed for execution in the original
+ <span class="fname">ntoskrnl.exe</span>.</p>
+ </li>
+ <li>
+ <p>There may still be valid code paths where some emulated W32 kernel
+ functionality and symbols remain unimplemented as these code paths were
+ just not hit during testing. The proper way would be to check all the
+ possibilities of such code paths execution from the filesystem driver
+ code disassembly.</p>
+ </li>
+ <li>
+ <p>No unusual error codes are expected from the filesystem drivers and
+ any such return codes will abort the project's execution. For example
+ code <span class="constant">STATUS_NO_SUCH_FILE</span> is expected and
+ correctly recognized but
+ <span class="constant">STATUS_FILE_CORRUPT_ERROR</span> will stop driver
+ execution.</p>
+
+ <p><a name="exception_fatal">No exceptions in W32 code are allowed</a>
+ - any thrown exception will result in driver execution abortion (instead
+ of just returning some error code as in the original W32 environment).</p>
+
+ <p>These issues should cease to be a problem after deployment of
+ sandbox wrapper which will restart the filesystem driver after any
+ unexpected error.</p>
+ </li>
+ <li>
+ <p><a name="todo_sandbox">Completion and activation of the sandbox
+ wrapper.</a> <span class="fname">src/libcaptive/sandbox/</span> sources
+ currently implement the base of both the client and the server sides of
+ CORBA interface to separate the client calling filesystem operations from
+ the W32 filesystem driver itself. Although CORBA usually makes sense for
+ crossmachine network interconnections here it gets a role of
+ inter-process interface between the regular client process and the
+ <span class="constant">chroot</span>ed/unprivileged/<span class="constant">ulimit</span>ed
+ environment of the W32 emulation address space.</p>
+
+ <p>Any W32 binary file must be always considered untrusted and therefore
+ it is needed to be sandboxed and accessible only via the CORBA interface.
+ Furthermore it is needed for clean implementation of $GnomeVFSmodule as
+ this project always handles <a href="#mounted_one">exactly one mounted
+ filesystem</a> but $GnomeVFSmodule interface expects unlimited number of
+ mounts in the scope of one process.</p>
+ </li>
+ <li>
+ <p>Project offers
+ <a name="offered_gnomevfs_todo">the filesystem access as its custom UNIX API</a>
+ (<span class="fname">captive/client-*.h</span>). This API is currently
+ offered in the scope of $GnomeVFSmodule interface as a filter applied to
+ the filesystem device (or filesystem image file).
+ As $GnomeVFS has no officially supported method of generic $gnulinux
+ kernel filesystem access it may be better to provide
+ <FIXME:LUFS><a name="offered_FUSE">an interface</a> for <span
+ class="productname">FUSE</span> \bookcitation{FUSE} instead.</p>
+
+ <p>To get transparent access to W32 filesystems from legacy
+ (=non <span class="productname">Gnome-VFS-2.0</span> aware) applications it is possible to use a draft
+ port \bookcitation{UserVFS-2.0} of the original <span class="productname">UserVFS</span>
+ \bookcitation{UserVFS} to <span class="productname">Gnome-VFS-2.0</span> interface.
+ It is also possible to use the test utilities of <span class="productname">Gnome-VFS-2.0</span> \bookcitation{GnomeVFS} package.</p>
+ </li>
+ <li>
+ <p>Implementation of interface to this project by
+ <span class="productname"><a href="http://surprise.sourceforge.net/">Partition Surprise</a></span>
+ partition manager. Although there currently exists
+ <span class="productname"><a href="http://mlf.linux.rulez.org/mlf/ezaz/ntfsresize.html">ntfsresize</a></span>
+ it is a data structures reverse engineered solution which may have
+ problems on various hard drives. <span class="productname">Partition
+ Surprise</span> project would be able to resize the disk safely by using
+ just the original W32 filesystem driver file although with some
+ performance hit.</p>
+ </li>
+ </ul>
+
+
+<h1>Related Projects</h1>
+
+ <p>The usual solution for file exchange between $freespeech operating systems
+ and <span class="productname">Microsoft Windows NT</span> is to use
+ <span class="productname">FAT32</span> (<span class="productname">vfat</span>
+ called in $gnulinux) partition and swap the files over it. This method is not
+ very comfortable as you never have access to all the files of the other
+ operating system.</p>
+
+ <a name="LinuxNTFScompet"><h2>$LinuxNTFS</h2></a>
+
+ <p>Although this project takes a completely different approach and has
+ a different architecture, the final goal is the same as for this
+ project - reliable read-write <span class="productname">NTFS</span>
+ filesystem support. $LinuxNTFS goes the way of reverse engineering
+ filesystem data structures (and possibly
+ <span class="fname">ntfs.sys</span> itself). Unfortunately after many years
+ of its development it did not yet reach the state of reliable read-write
+ access although its read-only part is considered trustworthy.</p>
+
+ <p>Using $LinuxNTFS for read-only access to existing partition with
+ <span class="productname">Microsoft Windows NT</span> installation is
+ planned to be able to acquire existing <span class="fname">ntfs.sys</span>,
+ <span class="fname">ntoskrnl.exe</span> and possibly
+ <span class="fname">ksecdd.sys</span> (imported by
+ <span class="fname">ntfs.sys</span>) files from the user's
+ <span class="productname">NTFS</span> partition.</p>
+
+ <h2><span class="productname"><a href="http://www.cgsecurity.org/ntfs.html">NTPwd NTFS Driver</a></span></h2>
+
+ <p>DOS based <a href="http://www.gnu.org/licenses/gpl.html">GPL-2.0</a>
+ read-write NTFS driver. Filesystem structures are reverse engineered in the
+ way of <a href="#LinuxNTFScompet">Linux-NTFS Project</a>. As it is not very
+ actively maintained it reaches a lower level of
+ <span class="productname">NTFS</span> compatibility.</p>
+
+ <h2>Virtual Machine with <span class="productname">Microsoft Windows NT</span></h2>
+
+ <p>Original <span class="productname">Microsoft Windows NT</span>
+ operating system can be run inside a virtual machine running under
+ $gnulinux (or vice versa) and share the read-write disk partitions by using
+ a network file sharing through a virtual network card.</p>
+
+ <p>Although there will be full filesystem structures compatibility the
+ <span class="productname">NTFS</span> partition cannot be accessed with no
+ system installed (or with non-bootable crashed system to repair it this
+ way)
+ (Although this project requires the original
+ <span class="fname">ntfs.sys</span> it can obtained from the legal
+ <span class="productname">Microsoft Windows NT</span> CD.),
+ it will have substantial system resources requirement and you also need
+ a virtual machine software product such as commercial
+ <span class="productname"><a href="http://www.vmware.com/download/workstation.html">VMware Workstation</a></span>.</p>
+
+
+<h1>Conclusion</h1>
+
+ <p>The project established <a href="#existing_emulation">a new form</a>
+ of W32 emulation model suitable for existing proprietary binary W32 kernel
+ code (drivers) while being hosted in an open source operating system
+ (currently $gnulinux). Currently, only the subsystems required by W32
+ filesystem drivers are implemented but the project can be further extended
+ for compatibility with various hardware-related drivers such as W32 video
+ drivers, W32 disk interface drivers etc.</p>
+
+ <p>Some W32 kernel space subsystems were implemented for the first time as
+ $freespeech code as they are still missing in the only currently available
+ $freespeech W32 kernel implementation, $ReactOS. Some W32 kernel function
+ behaviour expected by the drivers had to be reverse engineered and documented
+ in this project's API documentation (not listed in this book) and/or in
+ its source files, because its description in the
+ <span class="productname">Microsoft</span> documentation is missing.</p>
+
+ <p>Author had to get familiar both with the W32 kernel API and also with the
+ W32 kernel code by the reverse engineering. This experience also covers the
+ first <span class="productname">Microsoft Windows</span> compatible code ever
+ written by the author - <span class="fname">hal.dll</span> (Hardware
+ Abstraction Layer) part of W32 kernel.</p>
+
+ <p>Certain UNIX implementation interfaces allow a regular, non-privileged
+ user of UNIX system to mount image files with any W32 filesystem supported by
+ this project. Such mount operation usually requires UNIX
+ <span class="constant">root</span> privileges to do so. On the other hand the
+ choice of supported filesystem types is very limited as only a few
+ filesystem types are supported for the W32 platform.</p>
+HERE
+
+
+My::Web->footer();
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/captive/ documentation
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+SUBDIRS= \
+ fig \
+ dia
+
+EXTRA_DIST+= \
+ Index.html.pl
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/captive/ documentation .dia-s
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ parent-connector.dia
+
+CLEANFILES+= \
+ *.png \
+ *.gif
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
+ <dia:diagramdata>
+ <dia:attribute name="background">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="paper">
+ <dia:composite type="paper">
+ <dia:attribute name="name">
+ <dia:string>#A4#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="tmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="bmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="lmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="rmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="is_portrait">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="scaling">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="fitto">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="grid">
+ <dia:composite type="grid">
+ <dia:attribute name="width_x">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="width_y">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_x">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_y">
+ <dia:int val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="guides">
+ <dia:composite type="guides">
+ <dia:attribute name="hguides"/>
+ <dia:attribute name="vguides"/>
+ </dia:composite>
+ </dia:attribute>
+ </dia:diagramdata>
+ <dia:layer name="Background" visible="true">
+ <dia:object type="Flowchart - Box" version="0" id="O0">
+ <dia:attribute name="obj_pos">
+ <dia:point val="1,6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.95,5.95;7.0868,7.95"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="1,6"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="6.0368"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="1.9"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.1"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#disconnected#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="4.0184,7.19"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O1">
+ <dia:attribute name="obj_pos">
+ <dia:point val="11,6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="10.95,5.95;14.658,7.95"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="11,6"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="3.608"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="1.9"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.1"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#broken#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="12.804,7.19"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O2">
+ <dia:attribute name="obj_pos">
+ <dia:point val="1,12"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.9,11.9;4.676,14.9"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="1,12"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="3.576"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="2.8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.2"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#00ff00"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#closed
+clean#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="2.788,13.24"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O3">
+ <dia:attribute name="obj_pos">
+ <dia:point val="11,12"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="10.9,11.9;14.7552,14.9"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="11,12"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="3.6552"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="2.8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.2"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#closed
+dirty #</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="12.8276,13.24"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O4">
+ <dia:attribute name="obj_pos">
+ <dia:point val="1,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.9,17.9;5.072,20.9"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="1,18"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="3.972"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="2.8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.2"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#00ff00"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#opened
+clean#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="2.986,19.24"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O5">
+ <dia:attribute name="obj_pos">
+ <dia:point val="11,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="10.9,17.9;15.072,20.9"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="11,18"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="3.972"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="2.8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.2"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#opened
+dirty#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="12.986,19.24"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O6">
+ <dia:attribute name="obj_pos">
+ <dia:point val="0,9"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-0.05,8.95;23.05,9.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="0,9"/>
+ <dia:point val="23,9"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.1"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O7">
+ <dia:attribute name="obj_pos">
+ <dia:point val="18,8"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="15.8946,7.1323;20.1554,8.3823"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#no VFS#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="1.1"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="18,8"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O8">
+ <dia:attribute name="obj_pos">
+ <dia:point val="19,11"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="15.4365,10.1323;22.6135,11.3823"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#VFS exists#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="1.1"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="19,11"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O9">
+ <dia:attribute name="obj_pos">
+ <dia:point val="11,12"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="6.42685,7.30804;11.0707,12.0707"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="11,12"/>
+ <dia:point val="7.0368,7.9"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O3" connection="0"/>
+ <dia:connection handle="1" to="O0" connection="15"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O10">
+ <dia:attribute name="obj_pos">
+ <dia:point val="9,11"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="7.7284,10.3553;10.3216,11.3053"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#cease#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="9,11"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O11">
+ <dia:attribute name="obj_pos">
+ <dia:point val="4,12"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="3.2,7.95;4.8,12.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="4,12"/>
+ <dia:point val="4,8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O12">
+ <dia:attribute name="obj_pos">
+ <dia:point val="3,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="1.3924,9.35531;4.5576,11.1053"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#cease
+abort #</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="3,10"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O13">
+ <dia:attribute name="obj_pos">
+ <dia:point val="13,12"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="12.2,7.95;13.8,12.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="13,12"/>
+ <dia:point val="13,8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O14">
+ <dia:attribute name="obj_pos">
+ <dia:point val="12,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="10.7064,9.35531;13.3436,10.3053"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#abort #</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="12,10"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O15">
+ <dia:attribute name="obj_pos">
+ <dia:point val="5,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="4.2,7.95;5.8,18.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="5,18"/>
+ <dia:point val="5,8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O16">
+ <dia:attribute name="obj_pos">
+ <dia:point val="7,17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="5.4424,16.3553;8.6076,17.3053"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#abort #</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="7,17"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O17">
+ <dia:attribute name="obj_pos">
+ <dia:point val="13.979,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="13.1999,7.94832;14.8001,18.0501"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="13.979,18"/>
+ <dia:point val="14,8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O5" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O18">
+ <dia:attribute name="obj_pos">
+ <dia:point val="17,17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="15.4424,16.3553;18.6076,17.3053"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#abort #</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="17,17"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O19">
+ <dia:attribute name="obj_pos">
+ <dia:point val="1,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.2,14.75;1.8,18.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="1,18"/>
+ <dia:point val="1,14.8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O4" connection="0"/>
+ <dia:connection handle="1" to="O2" connection="11"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O20">
+ <dia:attribute name="obj_pos">
+ <dia:point val="3,17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="1.4424,16.3553;4.6076,17.3053"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#detach #</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="3,17"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O21">
+ <dia:attribute name="obj_pos">
+ <dia:point val="11,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="10.2,14.75;11.8,18.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="11,18"/>
+ <dia:point val="11,14.8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O5" connection="0"/>
+ <dia:connection handle="1" to="O3" connection="11"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O22">
+ <dia:attribute name="obj_pos">
+ <dia:point val="9,16"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="7.4512,15.3553;10.5988,16.3053"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#detach#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="9,16"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O23">
+ <dia:attribute name="obj_pos">
+ <dia:point val="4.972,19.4"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="4.922,18.6;11.05,20.2"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="4.972,19.4"/>
+ <dia:point val="11,19.4"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O4" connection="8"/>
+ <dia:connection handle="1" to="O5" connection="7"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O24">
+ <dia:attribute name="obj_pos">
+ <dia:point val="8,19"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="5.7208,18.3553;10.3292,19.3053"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#write op.#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="8,19"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Arc" version="0" id="O25">
+ <dia:attribute name="obj_pos">
+ <dia:point val="1,7.9"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-0.05,7.85;1.8,12.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="1,7.9"/>
+ <dia:point val="1,12"/>
+ </dia:attribute>
+ <dia:attribute name="curve_distance">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O0" connection="11"/>
+ <dia:connection handle="1" to="O2" connection="0"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O26">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-2,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-4.2792,9.35531;0.3292,11.1053"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#read op.
+write op.#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-2,10"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Arc" version="0" id="O27">
+ <dia:attribute name="obj_pos">
+ <dia:point val="1,14.8"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.1858,14.75;1.8,18.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="1,14.8"/>
+ <dia:point val="1,18"/>
+ </dia:attribute>
+ <dia:attribute name="curve_distance">
+ <dia:real val="0.7642"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O2" connection="11"/>
+ <dia:connection handle="1" to="O4" connection="0"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O28">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-2,17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-4.2792,16.3553;0.3292,18.1053"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#read op.
+write op.#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-2,17"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O29">
+ <dia:attribute name="obj_pos">
+ <dia:point val="7,23"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-2.702,22.3553;16.752,24.9053"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#shutdown: <detach> [down OK] <ceaase>
+shutdown: <detach> [crash] <abort>
+unsolicited: [crash] <abort> #</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="7,23"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:layer>
+</dia:diagram>
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/captive/ documentation .fig-s
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ architecture.fig \
+ sandbox.fig \
+ functype_native_fromunix.fig \
+ functype_patched_native_fromw32.fig \
+ functype_patched_pass_fromunix.fig \
+ functype_patched_pass_fromw32.fig \
+ functype_patched_wrap_fromunix.fig \
+ functype_patched_wrap_fromw32.fig \
+ functype_unpatched_native_fromw32.fig \
+ calltype_cdecl.fig \
+ calltype_stdcall.fig \
+ calltype_fastcall.fig
+
+CLEANFILES+= \
+ *.png \
+ *.gif
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+6 5325 -1350 7275 -1050
+6 5475 -1275 7200 -1125
+4 0 0 50 0 0 12 0.0000 4 135 1650 5505 -1125 GnomeVFS/test-shell\001
+-6
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5325 -1350 7275 -1350 7275 -1050 5325 -1050 5325 -1350
+-6
+6 4275 150 6075 450
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4275 450 6075 450 6075 150 4275 150 4275 450
+4 0 0 50 0 0 12 0.0000 4 180 1530 4425 375 libcaptive-gnomevfs\001
+-6
+6 2925 -3525 4425 -3000
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2925 -3525 4425 -3525 4425 -3000 2925 -3000 2925 -3525
+4 0 0 50 0 0 12 0.0000 4 180 1200 3097 -3202 user application\001
+-6
+6 3975 6450 5175 6750
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3975 6450 5175 6450 5175 6750 3975 6750 3975 6450
+4 0 0 50 0 0 12 0.0000 4 180 960 4103 6668 giognomevfs\001
+-6
+6 3975 7050 5175 7350
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3975 7350 5175 7350 5175 7050 3975 7050 3975 7350
+4 0 0 50 0 0 12 0.0000 4 135 885 4125 7275 GnomeVFS\001
+-6
+6 -525 -3525 975 -3000
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ -525 -3525 975 -3525 975 -3000 -525 -3000 -525 -3525
+4 0 0 50 0 0 12 0.0000 4 180 1200 -383 -3202 captive-cmdline\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 3675 2550 3675 2850
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1950 3150 2850 3150 2850 3450 1950 3450 1950 3150
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 3150 4200 3150 4200 3450 3150 3450 3150 3150
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 3150 5550 3150 5550 3450 4500 3450 4500 3150
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 3675 2850 2400 2850 2400 3150
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 2
+ 3675 2850 3675 3150
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 3675 2850 5025 2850 5025 3150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 4350 3750 4350 4050
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 3675 3450 3675 3750 4350 3750
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 5025 3450 5025 3750 4350 3750
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 2400 3450 2400 4050
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 2400 4350 2400 4650 3675 4650
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 4350 4350 4350 4650 3675 4650
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 3675 4650 3675 5100
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 3675 1650 3675 1350
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2925 1350 4425 1350 4425 1050 2925 1050 2925 1350
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 3675 1050 3675 750
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1875 1650 5475 1650 5475 2550 1875 2550 1875 1650
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 5175 450 5175 750 3675 750
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 2850 -375 2850 750 3675 750
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 4500 -1575 4500 -1875
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 5175 -450 5175 -750
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 5175 -750 6300 -750 6300 -1050
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 5175 -750 4425 -750 4425 -1050
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 5175 150 5175 -150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 2850 -675 2850 -1875
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3300 -1875 2400 -1875 2400 -2100 3300 -2100 3300 -1875
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 3675 -3000 3675 -2700
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4
+ 3000 -150 3225 -375 3225 -150 3000 -375
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3750 -375 3000 -375 3000 -150 3750 -150 3750 -375
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3525 -375 2175 -375 2175 -675 3525 -675 3525 -375
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 3675 6150 3675 5700
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 3675 5700 4425 5700 4425 5550
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 4
+ 3675 5700 2925 5700 2925 5100 3675 5100
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 4425 5250 4425 5100 3675 5100
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 3675 6150 2850 6150 2850 6750
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 4575 6750 4575 7050
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 4575 7350 4575 7650 3675 7650
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 3750 7650 3750 7950
+2 4 0 1 0 7 50 0 -1 0.000 0 0 10 0 0 5
+ 4350 8400 4350 7950 3075 7950 3075 8400 4350 8400
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 2850 7050 2850 7650 3750 7650
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 3675 6150 4575 6150 4575 6450
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5025 -1575 3825 -1575 3825 -1050 5025 -1050 5025 -1575
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3975 -1575 5025 -1575 5025 -1350 3975 -1350 3975 -1575
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5025 -1875 3975 -1875 3975 -2100 5025 -2100 5025 -1875
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5025 -2700 2100 -2700 2100 -1875 5025 -1875 5025 -2700
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 600 -1800 5100 -1800 5100 -2775 600 -2775 600 -1800
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 2100 2325 2100 2325 2400 3150 2400 3150 2100
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4275 2100 3300 2100 3300 2400 4275 2400 4275 2100
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4425 2100 5325 2100 5325 2400 4425 2400 4425 2100
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1725 4050 3075 4050 3075 4350 1725 4350 1725 4050
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3750 4050 4950 4050 4950 4350 3750 4350 3750 4050
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3675 5250 5175 5250 5175 5550 3675 5550 3675 5250
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4575 -150 5775 -150 5775 -450 4575 -450 4575 -150
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2550 6750 3150 6750 3150 7050 2550 7050 2550 6750
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 225 -3000 225 750 2850 750
+4 0 0 50 0 0 10 0.0000 4 105 375 4387 4740 --disk\001
+4 0 0 50 0 0 12 0.0000 4 180 1200 3098 1260 libcaptive/client\001
+4 0 0 50 0 0 12 0.0000 4 180 735 2100 1950 libcaptive\001
+4 0 0 50 0 0 12 0.0000 4 135 720 4073 -1140 UserVFS\001
+4 0 0 50 0 0 12 0.0000 4 135 345 3374 -2183 VFS\001
+4 0 0 50 0 0 12 0.0000 4 135 930 825 -2400 Linux kernel\001
+4 0 0 50 0 0 9 0.0000 4 75 345 3285 -210 TODO\001
+4 0 0 50 0 0 10 0.0000 4 105 450 4500 5700 --blind\001
+4 0 0 50 0 0 12 0.0000 4 180 2565 3750 4950 captive_giochannel [GIOChannel]\001
+4 0 0 50 0 0 12 0.0000 4 180 1065 3750 6000 [GIOChannel]\001
+4 0 0 50 0 0 12 0.0000 4 180 2460 4650 6975 VFS parent [GnomeVFSHandle]\001
+4 0 0 50 0 0 12 0.0000 4 180 360 3810 7867 [file]\001
+4 0 0 50 0 0 11 0.0000 4 105 255 2722 -1928 fuse\001
+4 0 0 50 0 0 11 0.0000 4 105 735 4116 -1928 Coda-client\001
+4 0 0 50 0 0 11 0.0000 4 105 525 4583 2318 ReactOS\001
+4 0 0 50 0 0 11 0.0000 4 150 630 2408 2310 halcaptive\001
+4 0 0 50 0 0 11 0.0000 4 105 795 3390 2325 ntoskrnl.exe\001
+4 0 0 50 0 0 12 0.0000 4 180 1230 3795 5460 giochannel-blind\001
+4 0 0 50 0 0 12 0.0000 4 180 990 3225 8235 image device\001
+4 0 0 50 0 0 11 0.0000 4 105 750 4088 -1403 Coda-server\001
+4 0 0 50 0 0 12 0.0000 4 180 1125 2296 -458 libcaptive-fuse\001
+4 0 0 50 0 0 12 0.0000 4 135 885 4733 -225 GnomeVFS\001
+4 0 0 50 0 0 12 0.0000 4 180 1665 3750 960 [libcaptive client API]\001
+4 0 0 50 0 0 12 0.0000 4 180 1335 3750 1560 [W32 kernel API]\001
+4 0 0 50 0 0 12 0.0000 4 180 930 3757 2760 [IFSkit API]\001
+4 0 0 50 0 0 13 0.0000 4 195 705 2088 3369 cdfs.sys\001
+4 0 0 50 0 0 13 0.0000 4 195 885 3279 3368 fastfat.sys\001
+4 0 0 50 0 0 12 0.0000 4 180 885 4612 3361 ext2fsd.sys\001
+4 0 0 50 0 0 12 0.0000 4 180 930 3900 4268 storage/disk\001
+4 0 0 50 0 0 12 0.0000 4 180 1080 1852 4260 storage/cdrom\001
+4 0 0 50 0 0 10 0.0000 4 105 600 2220 5700 --ro/--rw\001
+4 0 0 50 0 0 11 0.0000 4 105 315 2670 6968 GLib\001
+4 0 0 50 0 0 10 0.0000 4 105 510 1830 4748 --cdrom\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 2
+ 3750 1050 3750 3750
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 1800 3450 1800 3450 2100 2250 2100 2250 1800
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2032 2250 2032
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 1732 2250 1732
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2325 2250 2325
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 2100 3450 2100 3450 2400 2250 2400 2250 2100
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 1275 3450 1275 3450 1800 2250 1800 2250 1275
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 2400 3450 2400 3450 2700 2250 2700 2250 2400
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 2700 3450 2700 3450 3000 2250 3000 2250 2700
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2625 2250 2625
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2925 2250 2925
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5400 1800 6600 1800 6600 2100 5400 2100 5400 1800
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5025 2032 5400 2032
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5025 1732 5400 1732
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5025 2325 5400 2325
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5400 2100 6600 2100 6600 2400 5400 2400 5400 2100
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5400 1275 6600 1275 6600 1800 5400 1800 5400 1275
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5400 2400 6600 2400 6600 2700 5400 2700 5400 2400
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5400 2700 6600 2700 6600 3000 5400 3000 5400 2700
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5025 2625 5400 2625
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5025 2925 5400 2925
+4 0 0 50 0 16 13 0.0000 4 210 2745 2550 750 W32 cdecl calling convention\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2011 argument 3\001
+4 0 0 50 0 0 12 0.0000 4 135 960 2415 1696 rest of stack\001
+4 0 0 50 0 0 12 0.0000 4 15 135 2775 1485 ...\001
+4 0 0 50 0 0 12 0.0000 4 180 915 923 2977 [ESP+0x00]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 922 2377 [ESP+0x08]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 922 1778 [ESP+0x10]\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2910 argument 0\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2610 argument 1\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2310 argument 2\001
+4 0 0 50 0 0 12 0.0000 4 180 840 5579 2011 argument 3\001
+4 0 0 50 0 0 12 0.0000 4 135 960 5565 1696 rest of stack\001
+4 0 0 50 0 0 12 0.0000 4 15 135 5925 1485 ...\001
+4 0 0 50 0 0 12 0.0000 4 180 915 4073 2977 [ESP+0x00]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 4073 2677 [ESP+0x04]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 4072 2377 [ESP+0x08]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 4072 1778 [ESP+0x10]\001
+4 0 0 50 0 0 12 0.0000 4 180 840 5579 2910 argument 0\001
+4 0 0 50 0 0 12 0.0000 4 180 840 5579 2610 argument 1\001
+4 0 0 50 0 0 12 0.0000 4 180 840 5579 2310 argument 2\001
+4 0 0 50 0 0 12 0.0000 4 180 945 923 2078 [ESP+0x0C]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 923 2677 [ESP+0x04]\001
+4 0 0 50 0 0 12 0.0000 4 180 945 4073 2078 [ESP+0x0C]\001
+4 0 0 50 0 0 12 0.0000 4 135 795 1950 3750 before call\001
+4 0 0 50 0 0 12 0.0000 4 135 675 4950 3750 after call\001
+4 0 0 50 0 0 12 0.0000 4 135 1830 4050 3375 EDX:EAX=return value\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 1800 3450 1800 3450 2100 2250 2100 2250 1800
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2032 2250 2032
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 1732 2250 1732
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2325 2250 2325
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 2100 3450 2100 3450 2400 2250 2400 2250 2100
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 1275 3450 1275 3450 1800 2250 1800 2250 1275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 4725 2325 5100 2325
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5100 1275 6300 1275 6300 2400 5100 2400 5100 1275
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 2
+ 3750 1050 3750 3450
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2011 argument 3\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2310 argument 2\001
+4 0 0 50 0 0 12 0.0000 4 135 960 2415 1696 rest of stack\001
+4 0 0 50 0 0 12 0.0000 4 15 135 2775 1485 ...\001
+4 0 0 50 0 0 12 0.0000 4 135 960 5258 1982 rest of stack\001
+4 0 0 50 0 0 12 0.0000 4 135 1830 4050 2850 EDX:EAX=return value\001
+4 0 0 50 0 0 12 0.0000 4 180 1320 1200 3000 ECX=argument 0\001
+4 0 0 50 0 0 12 0.0000 4 180 1335 1200 2700 EDX=argument 1\001
+4 0 0 50 0 0 12 0.0000 4 180 645 1215 2377 [ESP+0]\001
+4 0 0 50 0 0 12 0.0000 4 180 645 1215 2078 [ESP+4]\001
+4 0 0 50 0 0 12 0.0000 4 180 645 1215 1778 [ESP+8]\001
+4 0 0 50 0 0 12 0.0000 4 180 645 4058 2385 [ESP+0]\001
+4 0 0 50 0 0 12 0.0000 4 15 135 5641 1755 ...\001
+4 0 0 50 0 0 12 0.0000 4 135 795 1950 3450 before call\001
+4 0 0 50 0 0 12 0.0000 4 135 675 4800 3450 after call\001
+4 0 0 50 0 16 13 0.0000 4 210 2910 2550 750 W32 fastcall calling convention\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 1800 3450 1800 3450 2100 2250 2100 2250 1800
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2032 2250 2032
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 1732 2250 1732
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2325 2250 2325
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 2100 3450 2100 3450 2400 2250 2400 2250 2100
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 1275 3450 1275 3450 1800 2250 1800 2250 1275
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 2
+ 3750 1050 3750 3450
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 2400 3450 2400 3450 2700 2250 2700 2250 2400
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 2700 3450 2700 3450 3000 2250 3000 2250 2700
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2625 2250 2625
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2925 2250 2925
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5025 2325 5400 2325
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5400 1275 6600 1275 6600 2400 5400 2400 5400 1275
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2011 argument 3\001
+4 0 0 50 0 0 12 0.0000 4 135 960 2415 1696 rest of stack\001
+4 0 0 50 0 0 12 0.0000 4 15 135 2775 1485 ...\001
+4 0 0 50 0 0 12 0.0000 4 135 1830 4050 2850 EDX:EAX=return value\001
+4 0 0 50 0 0 12 0.0000 4 135 795 1950 3450 before call\001
+4 0 0 50 0 16 13 0.0000 4 210 2850 2550 750 W32 stdcall calling convention\001
+4 0 0 50 0 0 12 0.0000 4 180 915 923 2977 [ESP+0x00]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 923 2677 [ESP+0x04]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 922 2377 [ESP+0x08]\001
+4 0 0 50 0 0 12 0.0000 4 180 945 893 2078 [ESP+0x0C]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 922 1778 [ESP+0x10]\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2910 argument 0\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2610 argument 1\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2310 argument 2\001
+4 0 0 50 0 0 12 0.0000 4 180 915 4058 2385 [ESP+0x00]\001
+4 0 0 50 0 0 12 0.0000 4 135 960 5558 1982 rest of stack\001
+4 0 0 50 0 0 12 0.0000 4 15 135 5941 1755 ...\001
+4 0 0 50 0 0 12 0.0000 4 135 675 4950 3450 after call\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Metric
+Letter
+100.00
+Single
+-2
+1200 2
+6 3150 5535 3870 6255
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 5535 3870 5535 3870 6075 3150 6075 3150 5535
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 6075 3870 6075 3870 6255 3150 6255 3150 6075
+4 0 0 50 0 0 12 0.0000 4 135 585 3237 5887 callee...\001
+4 0 0 50 0 0 9 0.0000 4 75 150 3439 6203 ret\001
+-6
+6 4275 5490 4950 5850
+4 0 0 50 0 0 12 0.0000 4 180 600 4309 5631 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 4382 5817 cdecl\001
+-6
+6 3060 3375 4005 3780
+6 3060 3555 4005 3780
+4 0 0 50 0 0 12 0.0000 4 180 900 3083 3698 calling code\001
+-6
+4 0 0 50 0 0 12 0.0000 4 135 465 3270 3510 UNIX\001
+-6
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3510 4140 3510 4410
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 0 1 2
+ 2 1 1.00 120.00 90.00
+ 3510 5085 3510 4815
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 4410 3870 4410 3870 4815 3150 4815 3150 4410
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 3510 6255 3510 6435 4185 6435 4185 4680 3870 4680
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 6
+ 0 0 1.00 60.00 120.00
+ 3870 4545 4320 4545 4320 5400 2835 5400 2835 5805 3150 5805
+4 0 0 50 0 0 12 0.0000 4 135 555 3242 4674 caller...\001
+4 0 0 50 0 0 12 0.0000 4 135 570 3240 4095 START\001
+4 0 0 50 0 0 12 0.0000 4 135 390 3330 5265 END\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Metric
+Letter
+100.00
+Single
+-2
+1200 2
+6 2625 2550 3225 3150
+4 0 0 50 0 1 10 0.0000 4 105 405 2720 2841 cdecl/\001
+4 0 0 50 0 0 10 0.0000 4 135 510 2674 2720 calltype\001
+4 0 0 50 0 1 10 0.0000 4 105 540 2657 2969 /stdcall/\001
+4 0 0 50 0 1 10 0.0000 4 150 525 2645 3096 /fastcall\001
+-6
+6 4725 1350 5550 1950
+4 0 0 50 0 1 12 0.0000 4 135 720 4778 1718 SIGSEGV\001
+4 0 0 50 0 0 12 0.0000 4 135 465 4901 1531 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 555 4864 1893 handler\001
+-6
+6 1650 1500 2475 1950
+4 0 0 50 0 0 12 0.0000 4 135 465 1831 1674 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 180 735 1719 1849 jumptable\001
+-6
+6 2925 1500 4425 1950
+4 0 0 50 0 1 12 0.0000 4 180 1470 2939 1665 Microsoft Windows\001
+4 0 0 50 0 0 12 0.0000 4 180 870 3225 1852 binary code\001
+-6
+6 600 1500 1125 1875
+4 0 0 50 0 0 12 0.0000 4 135 465 615 1665 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 360 668 1846 code\001
+-6
+6 4815 3240 5445 3420
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4815 3240 5445 3240 5445 3420 4815 3420 4815 3240
+4 0 0 50 0 0 9 0.0000 4 90 405 4950 3375 redirect\001
+-6
+6 953 3343 1628 3718
+4 0 0 50 0 0 12 0.0000 4 180 600 1017 3514 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 1090 3700 cdecl\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 2070 3375 2070 3555 2430 3555 2430 2520 3195 2520
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 3195 2385 2565 2385 2565 3330 3240 3330
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 7
+ 0 0 1.00 60.00 120.00
+ 5130 3420 5130 3555 5670 3555 5670 2025 1440 2025 1440 2475
+ 1845 2475
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 855 3150 855 3330 1665 3330 1665 2880 1845 2880
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1845 2700 1215 2700
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2790 2295 2790 2295 2970 1845 2970 1845 2790
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 3240 2295 3240 2295 3375 1845 3375 1845 3240
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2970 2295 2970 2295 3240 1845 3240 1845 2970
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2340 2295 2340 2295 2610 1845 2610 1845 2340
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2610 2295 2610 2295 2790 1845 2790 1845 2610
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 4275 4185 4275 4185 4635 3195 4635 3195 4275
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 2655 4185 2655 4185 2250 3195 2250 3195 2655
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3690 2655 3690 2835
+2 1 0 4 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3150 2115 3465 2250
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 3195 4185 3195 4185 3465 3195 3465 3195 3195
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 3465 4185 3465 4185 4275 3195 4275 3195 3465
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 4140 3330 4815 3330
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 2430 1215 2430 1215 2970 495 2970 495 2430
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 2970 1215 2970 1215 3150 495 3150 495 2970
+4 0 0 50 0 0 12 0.0000 4 105 210 3594 4507 ret\001
+4 0 0 50 0 0 9 0.0000 4 75 150 1993 3345 ret\001
+4 0 0 50 0 0 9 0.0000 4 105 270 1931 2457 entry\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 2558 trace\001
+4 0 0 50 0 0 9 0.0000 4 90 210 1957 3093 exit\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 3193 trace\001
+4 0 0 50 0 0 12 0.0000 4 135 555 3430 2510 caller...\001
+4 0 0 50 0 0 12 0.0000 4 135 570 2564 2212 START\001
+4 0 0 50 0 0 12 0.0000 4 135 390 3517 2981 END\001
+4 0 0 50 0 0 9 0.0000 4 75 270 3540 3382 break\001
+4 0 0 50 0 0 12 0.0000 4 135 540 3427 3885 unused\001
+4 0 0 50 0 0 12 0.0000 4 135 585 3413 4102 callee...\001
+4 0 0 50 0 0 12 0.0000 4 135 360 3484 3720 W32\001
+4 0 0 50 0 0 12 0.0000 4 135 585 582 2782 callee...\001
+4 0 0 50 0 0 9 0.0000 4 75 150 784 3098 ret\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Metric
+Letter
+100.00
+Single
+-2
+1200 2
+6 4594 4305 4849 4495
+4 0 0 50 0 0 9 0.0000 4 75 255 4594 4495 trace\001
+4 0 0 50 0 0 9 0.0000 4 90 210 4615 4395 exit\001
+-6
+6 4589 3696 4859 3872
+4 0 0 50 0 0 9 0.0000 4 105 270 4589 3771 entry\001
+4 0 0 50 0 0 9 0.0000 4 75 255 4594 3872 trace\001
+-6
+6 4990 3300 5740 4050
+4 0 0 50 0 1 12 0.0000 4 180 600 5049 3949 /fastcall\001
+4 0 0 50 0 1 12 0.0000 4 135 600 5066 3782 /stdcall/\001
+4 0 0 50 0 1 12 0.0000 4 135 435 5114 3634 cdecl/\001
+4 0 0 50 0 0 12 0.0000 4 180 600 5068 3463 calltype\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 57.15 114.30
+ 4950 4005 5985 4005
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 57.15 114.30
+ 6165 5400 6165 5580 5310 5580 5310 4275 4950 4275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 57.15 114.30
+ 6255 4005 6975 4005 6975 3690 7290 3690
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 3
+ 0 0 1.00 57.15 114.30
+ 7605 3960 7605 4140 6615 4140
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 57.15 114.30
+ 6615 4275 7290 4275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 57.15 114.30
+ 7605 4590 7605 4770 6975 4770 6975 4455 6255 4455
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 3870 4545 4185 4545 4185 3870 4500 3870
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 4500 6660 4500 6660 5040 5670 5040 5670 4500
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 5040 6660 5040 6660 5400 5670 5400 5670 5040
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 4230 5940 4230 5940 4500 5670 4500 5670 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5940 4230 6300 4230 6300 4500 5940 4500 5940 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6300 4230 6660 4230 6660 4500 6300 4500 6300 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5940 3960 6300 3960 6300 4230 5940 4230 5940 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6300 3960 6660 3960 6660 4230 6300 4230 6300 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 3600 7922 3600 7922 3780 7290 3780 7290 3600
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 3780 7920 3780 7920 3960 7290 3960 7290 3780
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 4230 7920 4230 7920 4410 7290 4410 7290 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 4410 7920 4410 7920 4590 7290 4590 7290 4410
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 3960 5940 3960 5940 4230 5670 4230 5670 3960
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3510 4140 3510 4410
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 0 1 2
+ 2 1 1.00 120.00 90.00
+ 3510 5085 3510 4815
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 4410 3870 4410 3870 4815 3150 4815 3150 4410
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4275 4950 4275 4950 4545 4500 4545 4500 4275
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4545 4950 4545 4950 4680 4500 4680 4500 4545
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 4725 4680 4725 4950 4185 4950 4185 4680 3870 4680
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 3645 4950 3645 4950 3915 4500 3915 4500 3645
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 3915 4950 3915 4950 4095 4500 4095 4500 3915
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4095 4950 4095 4950 4275 4500 4275 4500 4095
+4 0 0 50 0 0 12 0.0000 4 180 900 3083 3338 calling code\001
+4 0 0 50 0 1 12 0.0000 4 180 1470 5414 3150 Microsoft Windows\001
+4 0 0 50 0 0 12 0.0000 4 180 870 5700 3337 binary code\001
+4 0 0 50 0 0 12 0.0000 4 135 465 3270 3150 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 105 210 6069 5272 ret\001
+4 0 0 50 0 0 9 0.0000 4 75 120 5737 4140 #1\001
+4 0 0 50 0 0 9 0.0000 4 75 270 5970 4140 break\001
+4 0 0 50 0 0 9 0.0000 4 90 225 6360 4140 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 270 6331 4410 break\001
+4 0 0 50 0 0 9 0.0000 4 90 225 5996 4410 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 120 5737 4410 #2\001
+4 0 0 50 0 0 9 0.0000 4 75 465 7369 3921 #2=break\001
+4 0 0 50 0 0 9 0.0000 4 75 465 7366 4373 #1=break\001
+4 0 0 50 0 0 9 0.0000 4 90 420 7371 3744 #1=instr\001
+4 0 0 50 0 0 9 0.0000 4 90 420 7362 4545 #2=instr\001
+4 0 0 50 0 0 12 0.0000 4 135 465 4486 3159 UNIX\001
+4 0 0 50 0 1 12 0.0000 4 135 720 7253 3248 SIGSEGV\001
+4 0 0 50 0 0 12 0.0000 4 135 465 7376 3061 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 555 7339 3423 handler\001
+4 0 0 50 0 0 12 0.0000 4 135 555 3242 4674 caller...\001
+4 0 0 50 0 0 12 0.0000 4 135 585 5919 4837 callee...\001
+4 0 0 50 0 0 12 0.0000 4 135 570 3240 4095 START\001
+4 0 0 50 0 0 12 0.0000 4 135 390 3330 5265 END\001
+4 0 0 50 0 0 9 0.0000 4 75 150 4657 4662 ret\001
+4 0 0 50 0 0 12 0.0000 4 180 600 3904 3606 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 3977 3792 cdecl\001
+4 0 0 50 0 0 12 0.0000 4 180 735 4374 3334 jumptable\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Metric
+Letter
+100.00
+Single
+-2
+1200 2
+6 7275 3675 7950 4125
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 3735 7922 3735 7922 3915 7290 3915 7290 3735
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 3915 7920 3915 7920 4095 7290 4095 7290 3915
+4 0 0 50 0 0 9 0.0000 4 75 465 7369 4056 #2=break\001
+4 0 0 50 0 0 9 0.0000 4 90 420 7371 3879 #1=instr\001
+-6
+6 5100 3375 5700 3975
+4 0 0 50 0 1 10 0.0000 4 105 405 5195 3606 cdecl/\001
+4 0 0 50 0 0 10 0.0000 4 135 510 5149 3485 calltype\001
+4 0 0 50 0 1 10 0.0000 4 105 540 5132 3734 /stdcall/\001
+4 0 0 50 0 1 10 0.0000 4 150 525 5120 3861 /fastcall\001
+-6
+6 5175 4275 5775 4875
+4 0 0 50 0 1 10 0.0000 4 105 405 5250 4501 cdecl/\001
+4 0 0 50 0 0 10 0.0000 4 135 510 5204 4380 calltype\001
+4 0 0 50 0 1 10 0.0000 4 105 540 5187 4629 /stdcall/\001
+4 0 0 50 0 1 10 0.0000 4 150 525 5175 4756 /fastcall\001
+-6
+6 5400 2250 6900 2700
+4 0 0 50 0 1 12 0.0000 4 180 1470 5414 2430 Microsoft Windows\001
+4 0 0 50 0 0 12 0.0000 4 180 870 5700 2617 binary code\001
+-6
+6 4350 2250 5175 2700
+4 0 0 50 0 0 12 0.0000 4 180 735 4374 2614 jumptable\001
+4 0 0 50 0 0 12 0.0000 4 135 465 4486 2439 UNIX\001
+-6
+6 7200 2175 8025 2775
+4 0 0 50 0 1 12 0.0000 4 135 720 7253 2528 SIGSEGV\001
+4 0 0 50 0 0 12 0.0000 4 135 465 7376 2341 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 555 7339 2703 handler\001
+-6
+6 4595 4475 4850 4665
+4 0 0 50 0 0 9 0.0000 4 90 210 4616 4565 exit\001
+4 0 0 50 0 0 9 0.0000 4 75 255 4595 4665 trace\001
+-6
+6 4588 3872 4858 4048
+4 0 0 50 0 0 9 0.0000 4 75 255 4593 4048 trace\001
+4 0 0 50 0 0 9 0.0000 4 105 270 4588 3947 entry\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 57.15 114.30
+ 4950 4185 5985 4185
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 57.15 114.30
+ 6165 5400 6165 5580 5130 5580 5130 4365 4950 4365
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 57.15 114.30
+ 6255 4140 7065 4140 7065 3825 7290 3825
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 3
+ 0 0 1.00 57.15 114.30
+ 7605 4095 7605 4185 6615 4185
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 57.15 114.30
+ 6615 4275 7290 4275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 57.15 114.30
+ 7605 4590 7605 4725 6975 4725 6975 4455 6255 4455
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 4725 4860 4725 5040 4275 5040 4275 3285 5670 3285
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 4500 6660 4500 6660 5040 5670 5040 5670 4500
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 5040 6660 5040 6660 5400 5670 5400 5670 5040
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 4230 5940 4230 5940 4500 5670 4500 5670 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5940 4230 6300 4230 6300 4500 5940 4500 5940 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6300 4230 6660 4230 6660 4500 6300 4500 6300 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5940 3960 6300 3960 6300 4230 5940 4230 5940 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6300 3960 6660 3960 6660 4230 6300 4230 6300 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 3960 5940 3960 5940 4230 5670 4230 5670 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 3420 6660 3420 6660 3015 5670 3015 5670 3420
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 5670 3150 5040 3150 5040 4005 5985 4005
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 3375 7920 3375 7920 3555 7290 3555 7290 3375
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 6255 4005 6885 4005 6885 3465 7290 3465
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 7
+ 0 0 1.00 60.00 120.00
+ 7605 3555 7605 3645 8145 3645 8145 2790 4140 2790 4140 3960
+ 4500 3960
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 6165 3420 6165 3690
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 5670 2880 5940 3015
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4725 4950 4725 4950 4860 4500 4860 4500 4725
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4455 4950 4455 4950 4725 4500 4725 4500 4455
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4275 4950 4275 4950 4455 4500 4455 4500 4275
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4095 4950 4095 4950 4275 4500 4275 4500 4095
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 3825 4950 3825 4950 4095 4500 4095 4500 3825
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 4230 7920 4230 7920 4410 7290 4410 7290 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 4410 7920 4410 7920 4590 7290 4590 7290 4410
+4 0 0 50 0 0 12 0.0000 4 105 210 6069 5272 ret\001
+4 0 0 50 0 0 9 0.0000 4 75 120 5737 4140 #1\001
+4 0 0 50 0 0 9 0.0000 4 75 270 5970 4140 break\001
+4 0 0 50 0 0 9 0.0000 4 75 270 6331 4410 break\001
+4 0 0 50 0 0 9 0.0000 4 90 225 5996 4410 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 120 5737 4410 #2\001
+4 0 0 50 0 0 12 0.0000 4 135 585 5919 4837 callee...\001
+4 0 0 50 0 0 12 0.0000 4 135 555 5905 3275 caller...\001
+4 0 0 50 0 0 9 0.0000 4 90 405 7425 3510 redirect\001
+4 0 0 50 0 0 12 0.0000 4 135 390 5985 3825 END\001
+4 0 0 50 0 0 12 0.0000 4 135 570 5085 2970 START\001
+4 0 0 50 0 0 9 0.0000 4 75 150 4660 4819 ret\001
+4 0 0 50 0 0 9 0.0000 4 90 225 6356 4121 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 465 7365 4369 #1=break\001
+4 0 0 50 0 0 9 0.0000 4 90 420 7373 4545 #2=instr\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Metric
+Letter
+100.00
+Single
+-2
+1200 2
+6 3900 3450 4575 3825
+4 0 0 50 0 0 12 0.0000 4 180 600 3904 3606 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 3977 3792 cdecl\001
+-6
+6 5400 5475 6075 6225
+4 0 0 50 0 1 12 0.0000 4 180 600 5417 6123 /fastcall\001
+4 0 0 50 0 1 12 0.0000 4 135 600 5434 5956 /stdcall/\001
+4 0 0 50 0 1 12 0.0000 4 135 435 5482 5808 cdecl/\001
+4 0 0 50 0 0 12 0.0000 4 180 600 5436 5637 calltype\001
+-6
+6 3150 5550 3900 6600
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 5580 3690 5580 3690 5715 3150 5715 3150 5580
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 5715 3870 5715 3870 6075 3150 6075 3150 5715
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 6075 3870 6075 3870 6255 3150 6255 3150 6075
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3870 6255 3150 6255 3150 6435 3870 6435 3870 6255
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 6435 3870 6435 3870 6570 3150 6570 3150 6435
+4 0 0 50 0 16 8 0.0000 4 90 450 3195 5685 wrapper\001
+4 0 0 50 0 0 9 0.0000 4 90 510 3244 5881 arguments\001
+4 0 0 50 0 0 9 0.0000 4 75 300 3361 6007 check\001
+4 0 0 50 0 0 9 0.0000 4 75 150 3424 6540 ret\001
+-6
+6 4500 5850 4950 7125
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 6480 4950 6480 4950 6660 4500 6660 4500 6480
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 6930 4950 6930 4950 7065 4500 7065 4500 6930
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 6660 4950 6660 4950 6930 4500 6930 4500 6660
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 6300 4950 6300 4950 6480 4500 6480 4500 6300
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 6030 4950 6030 4950 6300 4500 6300 4500 6030
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4860 6030 4500 6030 4500 5895 4860 5895 4860 6030
+4 0 0 50 0 0 9 0.0000 4 75 150 4648 7035 ret\001
+4 0 0 50 0 0 9 0.0000 4 105 270 4586 6147 entry\001
+4 0 0 50 0 0 9 0.0000 4 75 255 4591 6248 trace\001
+4 0 0 50 0 0 9 0.0000 4 90 210 4612 6783 exit\001
+4 0 0 50 0 0 9 0.0000 4 75 255 4591 6883 trace\001
+4 0 0 50 0 16 8 0.0000 4 105 285 4548 6007 inner\001
+-6
+6 4275 5175 4950 5625
+4 0 0 50 0 0 12 0.0000 4 180 600 4347 5382 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 4420 5568 cdecl\001
+-6
+6 3375 6975 4050 7350
+4 0 0 50 0 0 12 0.0000 4 180 600 3422 7127 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 3495 7313 cdecl\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 57.15 114.30
+ 6255 4005 6975 4005 6975 3690 7290 3690
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 3
+ 0 0 1.00 57.15 114.30
+ 7605 3960 7605 4185 6615 4185
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 57.15 114.30
+ 6615 4275 7290 4275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 57.15 114.30
+ 7605 4590 7605 4770 6975 4770 6975 4455 6255 4455
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 3870 4545 4050 4545 4050 3870 4500 3870
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 4725 4770 4725 4950 4050 4950 4050 4680 3870 4680
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 4500 6660 4500 6660 5040 5670 5040 5670 4500
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 5040 6660 5040 6660 5400 5670 5400 5670 5040
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 4230 5940 4230 5940 4500 5670 4500 5670 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5940 4230 6300 4230 6300 4500 5940 4500 5940 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6300 4230 6660 4230 6660 4500 6300 4500 6300 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5940 3960 6300 3960 6300 4230 5940 4230 5940 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6300 3960 6660 3960 6660 4230 6300 4230 6300 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 3600 7922 3600 7922 3780 7290 3780 7290 3600
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 3780 7920 3780 7920 3960 7290 3960 7290 3780
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 4230 7920 4230 7920 4410 7290 4410 7290 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 4410 7920 4410 7920 4590 7290 4590 7290 4410
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 4410 3870 4410 3870 4815 3150 4815 3150 4410
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 3960 5940 3960 5940 4230 5670 4230 5670 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4185 4950 4185 4950 4365 4500 4365 4500 4185
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4635 4950 4635 4950 4770 4500 4770 4500 4635
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4365 4950 4365 4950 4635 4500 4635 4500 4365
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 3735 4950 3735 4950 4005 4500 4005 4500 3735
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 3735 4860 3735 4860 3600 4500 3600 4500 3735
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 4725 7065 4725 7155 4050 7155 4050 6345 3870 6345
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 4500 4095 4185 4095 4185 5895 3870 5895
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 3510 6570 3510 6750 4320 6750 4320 4275 4500 4275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 3870 6165 4500 6165
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 3
+ 0 0 1.00 60.00 120.00
+ 6165 5400 6165 6570 4950 6570
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 4950 6390 5310 6390 5310 4005 5985 4005
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4005 4950 4005 4950 4185 4500 4185 4500 4005
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3510 4140 3510 4410
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3510 4815 3510 5085
+4 0 0 50 0 1 12 0.0000 4 180 1470 5414 3150 Microsoft Windows\001
+4 0 0 50 0 0 12 0.0000 4 135 465 3270 3150 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 105 210 6069 5272 ret\001
+4 0 0 50 0 0 9 0.0000 4 75 120 5737 4140 #1\001
+4 0 0 50 0 0 9 0.0000 4 75 270 5970 4140 break\001
+4 0 0 50 0 0 9 0.0000 4 90 225 6360 4140 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 270 6331 4410 break\001
+4 0 0 50 0 0 9 0.0000 4 90 225 5996 4410 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 120 5737 4410 #2\001
+4 0 0 50 0 0 9 0.0000 4 75 465 7369 3921 #2=break\001
+4 0 0 50 0 0 9 0.0000 4 75 465 7366 4373 #1=break\001
+4 0 0 50 0 0 9 0.0000 4 90 420 7371 3744 #1=instr\001
+4 0 0 50 0 0 9 0.0000 4 90 420 7362 4545 #2=instr\001
+4 0 0 50 0 0 12 0.0000 4 135 465 4486 3159 UNIX\001
+4 0 0 50 0 1 12 0.0000 4 135 720 7253 3248 SIGSEGV\001
+4 0 0 50 0 0 12 0.0000 4 135 465 7376 3061 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 555 7339 3423 handler\001
+4 0 0 50 0 0 12 0.0000 4 135 555 3242 4674 caller...\001
+4 0 0 50 0 0 12 0.0000 4 135 585 5919 4837 callee...\001
+4 0 0 50 0 0 9 0.0000 4 75 150 4648 4740 ret\001
+4 0 0 50 0 0 9 0.0000 4 105 270 4586 3852 entry\001
+4 0 0 50 0 0 9 0.0000 4 75 255 4591 3953 trace\001
+4 0 0 50 0 0 9 0.0000 4 90 210 4612 4488 exit\001
+4 0 0 50 0 0 9 0.0000 4 75 255 4591 4588 trace\001
+4 0 0 50 0 16 8 0.0000 4 105 285 4543 3705 outer\001
+4 0 0 50 0 0 12 0.0000 4 180 735 4374 3334 jumptable\001
+4 0 0 50 0 0 12 0.0000 4 180 870 5700 3337 binary code\001
+4 0 0 50 0 0 12 0.0000 4 135 360 3323 3331 code\001
+4 0 0 50 0 0 12 0.0000 4 135 390 3342 5247 END\001
+4 0 0 50 0 0 12 0.0000 4 135 570 3240 4110 START\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Metric
+Letter
+100.00
+Single
+-2
+1200 2
+6 2625 2550 3225 3150
+4 0 0 50 0 1 10 0.0000 4 105 405 2720 2841 cdecl/\001
+4 0 0 50 0 0 10 0.0000 4 135 510 2674 2720 calltype\001
+4 0 0 50 0 1 10 0.0000 4 105 540 2657 2969 /stdcall/\001
+4 0 0 50 0 1 10 0.0000 4 150 525 2645 3096 /fastcall\001
+-6
+6 4725 1350 5550 1950
+4 0 0 50 0 1 12 0.0000 4 135 720 4778 1718 SIGSEGV\001
+4 0 0 50 0 0 12 0.0000 4 135 465 4901 1531 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 555 4864 1893 handler\001
+-6
+6 1800 3825 2325 5025
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 4410 2295 4410 2295 4590 1845 4590 1845 4410
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 4860 2295 4860 2295 4995 1845 4995 1845 4860
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 4590 2295 4590 2295 4860 1845 4860 1845 4590
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 4230 2295 4230 2295 4410 1845 4410 1845 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 3960 2295 3960 2295 4230 1845 4230 1845 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2205 3960 1845 3960 1845 3825 2205 3825 2205 3960
+4 0 0 50 0 0 9 0.0000 4 75 150 1993 4965 ret\001
+4 0 0 50 0 0 9 0.0000 4 105 270 1931 4077 entry\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 4178 trace\001
+4 0 0 50 0 0 9 0.0000 4 90 210 1957 4713 exit\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 4813 trace\001
+4 0 0 50 0 16 8 0.0000 4 105 285 1893 3937 inner\001
+-6
+6 675 4200 1350 4575
+4 0 0 50 0 0 12 0.0000 4 180 600 722 4382 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 795 4568 cdecl\001
+-6
+6 750 1950 1425 2325
+4 0 0 50 0 0 12 0.0000 4 180 600 814 2121 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 887 2307 cdecl\001
+-6
+6 1650 1500 2475 1950
+4 0 0 50 0 0 12 0.0000 4 135 465 1831 1674 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 180 735 1719 1849 jumptable\001
+-6
+6 2925 1500 4425 1950
+4 0 0 50 0 1 12 0.0000 4 180 1470 2939 1665 Microsoft Windows\001
+4 0 0 50 0 0 12 0.0000 4 180 870 3225 1852 binary code\001
+-6
+6 600 1500 1125 1875
+4 0 0 50 0 0 12 0.0000 4 135 465 615 1665 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 360 668 1846 code\001
+-6
+6 525 2550 1125 2850
+4 0 0 50 0 0 9 0.0000 4 90 510 581 2675 arguments\001
+4 0 0 50 0 0 9 0.0000 4 75 300 698 2801 check\001
+-6
+6 2625 3900 3225 4500
+4 0 0 50 0 1 10 0.0000 4 105 405 2720 4146 cdecl/\001
+4 0 0 50 0 0 10 0.0000 4 135 510 2674 4025 calltype\001
+4 0 0 50 0 1 10 0.0000 4 105 540 2657 4274 /stdcall/\001
+4 0 0 50 0 1 10 0.0000 4 150 525 2645 4401 /fastcall\001
+-6
+6 4800 2925 5475 3375
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4815 2970 5447 2970 5447 3150 4815 3150 4815 2970
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4815 3150 5445 3150 5445 3330 4815 3330 4815 3150
+4 0 0 50 0 0 9 0.0000 4 75 465 4894 3291 #2=break\001
+4 0 0 50 0 0 9 0.0000 4 90 420 4896 3114 #1=instr\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 2070 3375 2070 3555 2430 3555 2430 2520 3195 2520
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 3735 4185 3735 4185 4275 3195 4275 3195 3735
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 3465 3465 3465 3465 3735 3195 3735 3195 3465
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3465 3465 3825 3465 3825 3735 3465 3735 3465 3465
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3825 3465 4185 3465 4185 3735 3825 3735 3825 3465
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3465 3195 3825 3195 3825 3465 3465 3465 3465 3195
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3825 3195 4185 3195 4185 3465 3825 3465 3825 3195
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 3195 3465 3195 3465 3465 3195 3465 3195 3195
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 3195 2385 2565 2385 2565 3240 3510 3240
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4815 2610 5445 2610 5445 2790 4815 2790 4815 2610
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 3780 3240 4410 3240 4410 2700 4815 2700
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 7
+ 0 0 1.00 60.00 120.00
+ 5130 2790 5130 2880 5670 2880 5670 2025 1440 2025 1440 2475
+ 1845 2475
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 855 3420 855 3600 1665 3600 1665 2880 1845 2880
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1845 2700 1215 2700
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2790 2295 2790 2295 2970 1845 2970 1845 2790
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 3240 2295 3240 2295 3375 1845 3375 1845 3240
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2970 2295 2970 2295 3240 1845 3240 1845 2970
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2340 2295 2340 2295 2610 1845 2610 1845 2340
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2340 2205 2340 2205 2205 1845 2205 1845 2340
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2610 2295 2610 2295 2790 1845 2790 1845 2610
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 2070 4995 2070 5085 1395 5085 1395 3150 1215 3150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 1215 2970 1530 2970 1530 4095 1845 4095
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 2385 1035 2385 1035 2520 495 2520 495 2385
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 2520 1215 2520 1215 2880 495 2880 495 2520
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 2880 1215 2880 1215 3060 495 3060 495 2880
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1215 3060 495 3060 495 3240 1215 3240 1215 3060
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 3240 1215 3240 1215 3420 495 3420 495 3240
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 2295 4320 2565 4320 2565 3420 3510 3420
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 4275 4185 4275 4185 4635 3195 4635 3195 4275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 3690 4635 3690 4815 2565 4815 2565 4500 2295 4500
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 2655 4185 2655 4185 2250 3195 2250 3195 2655
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 57.15 114.30
+ 3780 3375 4590 3375 4590 3060 4815 3060
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 3
+ 0 0 1.00 57.15 114.30
+ 5130 3330 5130 3420 4140 3420
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 57.15 114.30
+ 4140 3510 4815 3510
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 57.15 114.30
+ 5130 3825 5130 3960 4500 3960 4500 3690 3780 3690
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4815 3465 5445 3465 5445 3645 4815 3645 4815 3465
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4815 3645 5445 3645 5445 3825 4815 3825 4815 3645
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3690 2655 3690 2835
+2 1 0 4 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3150 2115 3465 2250
+4 0 0 50 0 0 12 0.0000 4 105 210 3594 4507 ret\001
+4 0 0 50 0 0 9 0.0000 4 75 120 3262 3375 #1\001
+4 0 0 50 0 0 9 0.0000 4 75 270 3495 3375 break\001
+4 0 0 50 0 0 9 0.0000 4 75 270 3856 3645 break\001
+4 0 0 50 0 0 9 0.0000 4 90 225 3521 3645 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 120 3262 3645 #2\001
+4 0 0 50 0 0 12 0.0000 4 135 585 3444 4072 callee...\001
+4 0 0 50 0 0 9 0.0000 4 90 405 4950 2745 redirect\001
+4 0 0 50 0 0 9 0.0000 4 75 150 1993 3345 ret\001
+4 0 0 50 0 0 9 0.0000 4 105 270 1931 2457 entry\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 2558 trace\001
+4 0 0 50 0 0 9 0.0000 4 90 210 1957 3093 exit\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 3193 trace\001
+4 0 0 50 0 16 8 0.0000 4 105 285 1888 2310 outer\001
+4 0 0 50 0 16 8 0.0000 4 90 450 548 2490 wrapper\001
+4 0 0 50 0 0 9 0.0000 4 75 150 784 3363 ret\001
+4 0 0 50 0 0 12 0.0000 4 135 555 3430 2510 caller...\001
+4 0 0 50 0 0 9 0.0000 4 90 225 3885 3356 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 465 4895 3608 #1=break\001
+4 0 0 50 0 0 9 0.0000 4 90 420 4894 3780 #2=instr\001
+4 0 0 50 0 0 12 0.0000 4 135 570 2564 2212 START\001
+4 0 0 50 0 0 12 0.0000 4 135 390 3517 2981 END\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Metric
+Letter
+100.00
+Single
+-2
+1200 2
+6 2625 2550 3225 3150
+4 0 0 50 0 1 10 0.0000 4 105 405 2720 2841 cdecl/\001
+4 0 0 50 0 0 10 0.0000 4 135 510 2674 2720 calltype\001
+4 0 0 50 0 1 10 0.0000 4 105 540 2657 2969 /stdcall/\001
+4 0 0 50 0 1 10 0.0000 4 150 525 2645 3096 /fastcall\001
+-6
+6 1650 1500 2475 1950
+4 0 0 50 0 0 12 0.0000 4 135 465 1831 1674 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 180 735 1719 1849 jumptable\001
+-6
+6 2925 1500 4425 1950
+4 0 0 50 0 1 12 0.0000 4 180 1470 2939 1665 Microsoft Windows\001
+4 0 0 50 0 0 12 0.0000 4 180 870 3225 1852 binary code\001
+-6
+6 600 1500 1125 1875
+4 0 0 50 0 0 12 0.0000 4 135 465 615 1665 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 360 668 1846 code\001
+-6
+6 975 3555 1650 3930
+4 0 0 50 0 0 12 0.0000 4 180 600 1017 3694 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 1090 3880 cdecl\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 2070 3555 2070 3735 2430 3735 2430 2520 3195 2520
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 3195 2385 1620 2385 1620 2655 1845 2655
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 2655 4185 2655 4185 2250 3195 2250 3195 2655
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3690 2655 3690 2835
+2 1 0 4 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3150 2115 3465 2250
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 855 3330 855 3510 1665 3510 1665 3060 1845 3060
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1845 2880 1215 2880
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2970 2295 2970 2295 3150 1845 3150 1845 2970
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 3420 2295 3420 2295 3555 1845 3555 1845 3420
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 3150 2295 3150 2295 3420 1845 3420 1845 3150
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2520 2295 2520 2295 2790 1845 2790 1845 2520
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2790 2295 2790 2295 2970 1845 2970 1845 2790
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 2610 1215 2610 1215 3150 495 3150 495 2610
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 3150 1215 3150 1215 3330 495 3330 495 3150
+4 0 0 50 0 0 12 0.0000 4 135 555 3430 2510 caller...\001
+4 0 0 50 0 0 12 0.0000 4 135 570 2564 2212 START\001
+4 0 0 50 0 0 12 0.0000 4 135 390 3517 2981 END\001
+4 0 0 50 0 0 9 0.0000 4 75 150 1993 3525 ret\001
+4 0 0 50 0 0 9 0.0000 4 105 270 1931 2637 entry\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 2738 trace\001
+4 0 0 50 0 0 9 0.0000 4 90 210 1957 3273 exit\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 3373 trace\001
+4 0 0 50 0 0 12 0.0000 4 135 585 582 2962 callee...\001
+4 0 0 50 0 0 9 0.0000 4 75 150 784 3278 ret\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+6 5325 -1350 7275 -1050
+6 5505 -1260 7155 -1125
+4 0 0 50 0 0 12 0.0000 4 135 1650 5505 -1125 GnomeVFS/test-shell\001
+-6
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5325 -1350 7275 -1350 7275 -1050 5325 -1050 5325 -1350
+-6
+6 4575 -450 5775 -150
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4575 -150 5775 -150 5775 -450 4575 -450 4575 -150
+4 0 0 50 0 0 12 0.0000 4 135 885 4725 -225 GnomeVFS\001
+-6
+6 2625 1650 4913 3150
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3075 1800 4425 1800 4425 2100 3075 2100 3075 1800
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3075 2400 4425 2400 4425 3000 3075 3000 3075 2400
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 3750 2400 3750 2100
+2 2 2 1 0 7 50 0 -1 3.000 0 0 -1 0 0 5
+ 4875 1650 2625 1650 2625 3150 4875 3150 4875 1650
+4 0 0 50 0 0 12 0.0000 4 180 1200 3173 2025 libcaptive/client\001
+4 0 0 50 0 0 10 0.0000 4 135 1110 3803 2303 [W32 kernel API]\001
+4 0 0 50 0 0 15 0.0000 4 195 825 3353 2782 libcaptive\001
+-6
+6 3150 3600 4350 3900
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 3600 4350 3600 4350 3900 3150 3900 3150 3600
+4 0 0 50 0 0 12 0.0000 4 180 960 3278 3818 giognomevfs\001
+-6
+6 3150 4200 4350 4500
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 4500 4350 4500 4350 4200 3150 4200 3150 4500
+4 0 0 50 0 0 12 0.0000 4 135 885 3300 4425 GnomeVFS\001
+-6
+6 3525 -3525 5025 -2700
+6 3525 -3525 5025 -3000
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3525 -3525 5025 -3525 5025 -3000 3525 -3000 3525 -3525
+4 0 0 50 0 0 12 0.0000 4 180 1200 3697 -3202 user application\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 4275 -3000 4275 -2700
+-6
+6 5025 1650 7313 3150
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5475 1800 6825 1800 6825 2100 5475 2100 5475 1800
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5475 2400 6825 2400 6825 3000 5475 3000 5475 2400
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 6150 2400 6150 2100
+2 2 2 1 0 7 50 0 -1 3.000 0 0 -1 0 0 5
+ 7275 1650 5025 1650 5025 3150 7275 3150 7275 1650
+4 0 0 50 0 0 12 0.0000 4 180 1200 5573 2025 libcaptive/client\001
+4 0 0 50 0 0 10 0.0000 4 135 1110 6203 2303 [W32 kernel API]\001
+4 0 0 50 0 0 15 0.0000 4 195 825 5753 2782 libcaptive\001
+-6
+6 5550 3600 6750 3900
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5550 3600 6750 3600 6750 3900 5550 3900 5550 3600
+4 0 0 50 0 0 12 0.0000 4 180 960 5678 3818 giognomevfs\001
+-6
+6 5550 4200 6750 4500
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5550 4500 6750 4500 6750 4200 5550 4200 5550 4500
+4 0 0 50 0 0 12 0.0000 4 135 885 5700 4425 GnomeVFS\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 4500 -1575 4500 -1875
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 5175 -450 5175 -750
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 5175 -750 6300 -750 6300 -1050
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 3
+ 5175 -750 4425 -750 4425 -1050
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5025 -1575 3825 -1575 3825 -1050 5025 -1050 5025 -1575
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 5175 150 5175 -150
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2775 1200 7575 1200 7575 150 2775 150 2775 1200
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2925 1200 4875 1200 4875 750 2925 750 2925 1200
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 3750 1200 3750 1800
+2 2 2 1 0 7 50 0 -1 3.000 0 0 -1 0 0 5
+ 2625 1650 3375 1650 3375 1425 2625 1425 2625 1650
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 3750 3600 3750 3000
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 3750 3900 3750 4200
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 3750 4500 3750 4800
+2 4 0 1 0 7 50 0 -1 0.000 0 0 10 0 0 5
+ 4500 5250 4500 4800 3000 4800 3000 5250 4500 5250
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5025 -2700 3525 -2700 3525 -1875 5025 -1875 5025 -2700
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2175 -1800 5100 -1800 5100 -2775 2175 -2775 2175 -1800
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3975 -1575 5025 -1575 5025 -1350 3975 -1350 3975 -1575
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5025 -1875 3975 -1875 3975 -2100 5025 -2100 5025 -1875
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 6150 1200 6150 1800
+2 2 2 1 0 7 50 0 -1 3.000 0 0 -1 0 0 5
+ 5025 1650 5775 1650 5775 1425 5025 1425 5025 1650
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 6150 3600 6150 3000
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 6150 3900 6150 4200
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2
+ 6150 4500 6150 4800
+2 4 0 1 0 7 50 0 -1 0.000 0 0 10 0 0 5
+ 6900 5250 6900 4800 5400 4800 5400 5250 6900 5250
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5025 1200 6975 1200 6975 750 5025 750 5025 1200
+4 0 0 50 0 0 12 0.0000 4 135 720 4073 -1140 UserVFS\001
+4 0 0 50 0 0 12 0.0000 4 135 630 2700 1597 sandbox\001
+4 0 0 50 0 0 12 0.0000 4 180 1530 4425 525 libcaptive-gnomevfs\001
+4 0 0 50 0 0 12 0.0000 4 135 345 4050 -2325 VFS\001
+4 0 0 50 0 0 11 0.0000 4 105 750 4103 -1395 Coda-server\001
+4 0 0 50 0 0 12 0.0000 4 135 630 5100 1597 sandbox\001
+4 0 0 50 0 0 12 0.0000 4 180 2460 6225 4125 VFS parent [GnomeVFSHandle]\001
+4 0 0 50 0 0 12 0.0000 4 180 360 6210 4717 [file]\001
+4 0 0 50 0 0 12 0.0000 4 180 1065 6225 3450 [GIOChannel]\001
+4 0 0 50 0 0 12 0.0000 4 180 1665 6225 1500 [libcaptive client API]\001
+4 0 0 50 0 0 12 0.0000 4 180 750 7350 1725 [CORBA]\001
+4 0 0 50 0 0 12 0.0000 4 180 750 7350 3172 [CORBA]\001
+4 0 0 50 0 0 12 0.0000 4 15 135 7200 1050 ...\001
+4 0 0 50 0 0 11 0.0000 4 150 1530 3067 1035 captiveVFS #1 [GObject]\001
+4 0 0 50 0 0 11 0.0000 4 150 1530 5167 1035 captiveVFS #2 [GObject]\001
+4 0 0 50 0 0 12 0.0000 4 180 1215 5557 5085 image device #2\001
+4 0 0 50 0 0 12 0.0000 4 180 1215 3157 5086 image device #1\001
+4 0 0 50 0 0 12 0.0000 4 135 930 2340 -2400 Linux kernel\001
+4 0 0 50 0 0 11 0.0000 4 105 735 4095 -1928 Coda-client\001
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::checkstatic'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::checkstatic::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+use My::Project;
+use project::checkstatic::ListItem;
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::checkstatic::ListItem::ListItem,
+ );
+
+My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::checkstatic;
+package project::checkstatic::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"C Sources Symbol Attributes Checker",
"priority"=>7,
"download"=>"http://cvs.jankratochvil.net/viewcvs/*checkout*/nethome/home/lace/bin/checkstatic?rev=HEAD",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::cvsbranchdiff::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::cvsbranchdiff::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::cvsbranchdiff::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::cvsbranchdiff::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::cvsbranchdiff;
+package project::cvsbranchdiff::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"CVS Branching Utility",
"priority"=>6,
"download"=>"http://cvs.jankratochvil.net/viewcvs/*checkout*/nethome/home/lace/bin/cvsbranchdiff?rev=HEAD",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::cvsutil::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::cvsutil::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::cvsutil::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::cvsutil::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::cvsutil;
+package project::cvsutil::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"CVS General Utility",
"priority"=>7,
"download"=>"http://cvs.jankratochvil.net/viewcvs/*checkout*/nethome/home/lace/bin/cvsutil?rev=HEAD",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::d1xnet::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::d1xnet::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::d1xnet::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::d1xnet::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::d1xnet;
+package project::d1xnet::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"<a href=\"http://d1x.warpcore.org/\">D1X</a> native TCP/IP support patch",
"priority"=>2,
"download"=>"d1x-tcpip-0.99.1.diff.gz",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::doswatch::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::doswatch::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::doswatch::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::doswatch::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::doswatch;
+package project::doswatch::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"DOSWatcher - DOS File Access Snooper",
"priority"=>2,
"download"=>"doswatch.zip",
.' calls access on the secondary console. Useful for many failure discoveries'
.' for weird software packages with broken file/directory access.</p>'
.' <ul>'
- .' <li>Requires MDA/Hercules secondary adapter to be usable'
- .' <li>Contains also MDABIOS, generic secondary adapter display layer'
- .' <li>Can be run on primary-only VGA (with not much comfort, indeed)'
+ .' <li>MDA/Hercules secondary adapter recommended for DOSWATCH</li>'
+ .' <li>Package contains also MDABIOS - generic secondary adapter driver</li>'
+ .' <li>MDABIOS features DOS commands accessible device "mda$"</li>'
+ .' <li>DOSWATCH can be run on single VGA card (with not much comfort, indeed)</li>'
.' </ul>'
);
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::fixhtml::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::fixhtml::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::fixhtml::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::fixhtml::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::fixhtml;
+package project::fixhtml::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Converter of HTML Files URLs to Relative",
"priority"=>3,
"download"=>"fixhtml.pl",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::ircon::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::ircon::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::ircon::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::ircon::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::ircon;
+package project::ircon::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"IRCon - Infrared Remote Control",
"priority"=>5,
"download"=>"ircon.tar.gz",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::kix::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::kix::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::kix::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::kix::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::kix;
+package project::kix::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"KIX - KaliNix Replacement",
"priority"=>4,
"download"=>"kix.c",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::kware::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::kware::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::kware::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::kware::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::kware;
+package project::kware::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"KernelWare, Linux Kernel Drivers in Userland",
"priority"=>5,
"download"=>"kware.tar.gz",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::line9k::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::line9k::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::line9k::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::line9k::ListItem::ListItem,
);
print <<'HERE';
fork of <code>+5V</code>/<code>GND</code> pins are required to power this hardware switch.</p>
HERE
-print '<table border="0"><tr><td align="center">'.My::Web::img("line9k.gif","AC Switch Scheme").'</td></tr></table>'."\n";
+print '<table border="0"><tr><td align="center">'.My::Web::img("line9k","AC Switch Scheme").'</td></tr></table>'."\n";
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::line9k;
+package project::line9k::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Modem / Nokia 9110 GSM data gate",
"priority"=>7,
"download"=>"http://cvs.jankratochvil.net/viewcvs/*checkout*/nethome/usr/local/sbin/line9k?rev=HEAD",
"description"=>""
.'<p>Waits for incoming PPP data connection, authorizes it and answers it.</p>'
.'<p>Scheme of computer controllde hardware charger for Nokia Communicator 9110 is supplied.'
- .'It keeps the Nokia battery fit by automatically controlled battery charging cycles.</p>'
+ .' It keeps the Nokia battery fit by automatically controlled battery charging cycles.</p>'
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl \
+ Index.html.pl \
line9k.fig
-noinst_DATA+= \
- index.html \
- line9k.gif
-
-index.html: line9k.gif
-
CLEANFILES+= \
- line9k.fig.bak
+ line9k.fig.bak \
+ line9k.png \
+ line9k.gif
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::mdsms::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::mdsms::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::mdsms::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::mdsms::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::mdsms;
+package project::mdsms::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Mobile Device SMS Tool",
"priority"=>8,
"download-sources .tar.gz"=>"mdsms-1.5.2.tar.gz",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::mod_auth_tacacs::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::mod_auth_tacacs::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::mod_auth_tacacs::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::mod_auth_tacacs::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::mod_auth_tacacs;
+package project::mod_auth_tacacs::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"<a href=\"http://sourceforge.net/projects/mod-auth-tacacs/\">mod_auth_tacacs</a> TACACS+ test client",
"priority"=>2,
"download"=>"mod_auth_tacacs-2.0.2-gts1-checkout.diff.gz",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::mot2as::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::mot2as::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::mot2as::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::mot2as::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::mot2as;
+package project::mot2as::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Motorola to AT&T/GNU Assembler Syntax Converter",
"priority"=>5,
"download"=>"mot2as.c",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::netstat::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::netstat::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::netstat::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::netstat::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::netstat;
+package project::netstat::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Program name display for <a href=\"http://www.inka.de/sites/lina/linux/NetTools/\">net-tools-1.50</a>/netstat",
"priority"=>3,
"download"=>"net-tools-1.50-progname.diff.gz",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::oslik::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::oslik::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::oslik::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::oslik::ListItem::ListItem,
);
print <<"HERE";
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::oslik;
+package project::oslik::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Logical Puzzle in Prolog",
"priority"=>5,
"download"=>"oslik/oslik.zip",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::patchd2::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::patchd2::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::patchd2::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::patchd2::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::patchd2;
+package project::patchd2::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Patch <a href=\"http://www.descent2.com/\">Descent 2</a> to Avoid CD-ROM",
"priority"=>2,
"download"=>"patchd2.zip",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::pipebuf'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::pipebuf::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+use My::Project;
+use project::pipebuf::ListItem;
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::pipebuf::ListItem::ListItem,
+ );
+
+My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::pipebuf;
+package project::pipebuf::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"PipeBuf - Data Buffering Tool",
"priority"=>8,
"download"=>"pipebuf.c",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::ppp9k::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::ppp9k::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::ppp9k::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::ppp9k::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::ppp9k;
+package project::ppp9k::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Nokia Communicator Leased Line",
"priority"=>6,
"download"=>"http://cvs.jankratochvil.net/viewcvs/*checkout*/nethome/home/lace/bin/ppp9k?rev=HEAD",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::redirector_ad::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::redirector_ad::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::redirector_ad::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::redirector_ad::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::redirector_ad;
+package project::redirector_ad::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Banner Killer as 'squid redirector'",
"priority"=>7,
"link-CVS download"=>"http://cvs.jankratochvil.net/viewcvs/redirector-ad/redirector-ad.tar.gz?tarball=1",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::smbfs::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::smbfs::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::smbfs::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::smbfs::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::smbfs;
+package project::smbfs::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"SMB Kernel Filesystem Acceleration",
"priority"=>6,
"download"=>"smbfs-2.1.132-blocksize.diff",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::sshpatch::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::sshpatch::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::sshpatch::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::sshpatch::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::sshpatch;
+package project::sshpatch::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"SSH-1 patch for <i>KeepAliveData</i> and <i>OnDemandForward</i>",
"priority"=>7,
"download"=>"ssh-1.2.30-kadata+odforw.tar.gz",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::step::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::step::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::step::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::step::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::step;
+package project::step::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"STEP - Student's Trainee Exchange Programme",
"priority"=>4,
"download"=>"step.tar.gz",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::surprise::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::surprise::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::surprise::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::surprise::ListItem::ListItem,
);
-print '<table border="0"><tr><td align="center">'.My::Web::img("surprise-gnome-0.gif","Gnome client").'</td></tr></table>'."\n";
+print '<table border="0"><tr><td align="center">'.My::Web::img("surprise-gnome-0","Gnome client").'</td></tr></table>'."\n";
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::surprise;
+package project::surprise::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Partition Surprise",
"priority"=>9,
"download-Page on SourceForge.net"=>"http://sourceforge.net/project/showfiles.php?group_id=10546",
include $(top_srcdir)/Makefile-head.am
EXTRA_DIST+= \
- ListItem.pm \
- index.html.pl
+ ListItem.pm \
+ Index.html.pl \
+ surprise-gnome-0.png
-noinst_DATA+= \
- index.html
+CLEANFILES+= \
+ surprise-gnome-0.gif
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::tac_plus::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::tac_plus::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::tac_plus::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::tac_plus::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::tac_plus;
+package project::tac_plus::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"TACACS+ Server NAS Host Based Authorization",
"priority"=>8,
"download-GTS rel.4 diff for TACACS+ v4.0.3"=>"tac_plus-F4.0.3.alpha.8.gts4.diff.gz",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::tcp_rto::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::tcp_rto::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::tcp_rto::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::tcp_rto::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::tcp_rto;
+package project::tcp_rto::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Linux Kernel Patch for Maximal Round-trip-time",
"priority"=>7,
"download-Linux kernel 2.2.17 patch"=>"linux-2.2.17-tcp_rto-1.diff",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::tcpdump::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::tcpdump::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::tcpdump::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::tcpdump::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::tcpdump;
+package project::tcpdump::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"tcpdump ASCII Dump Patch",
"priority"=>6,
"download"=>"tcpdump-3.4-ASCIIdump.diff",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::timeplan::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::timeplan::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::timeplan::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::timeplan::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::timeplan;
+package project::timeplan::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Time Log Summarizer",
"priority"=>6,
"download"=>"timeplan-1.0.1.tar.gz",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::vblib::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::vblib::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::vblib::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::vblib::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::vblib;
+package project::vblib::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Variable Buffers Library",
"priority"=>4,
"download"=>"vblib-1.0.0.tar.gz",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::winvnc::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::winvnc::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::winvnc::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::winvnc::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::winvnc;
+package project::winvnc::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Patch for Secret WinVNC Server Run",
"priority"=>6,
"download-already patched version 3.3.3r9"=>"vnc-3.3.3r9_x86_win32-exe-SECRET.zip",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::wllib::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::wllib::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::wllib::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::wllib::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::wllib;
+package project::wllib::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Line drawing Crossplatform Library",
"priority"=>4,
"download"=>"wllib-1.0.0.tar.gz",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::xbill::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
+use My::Project;
use project::xbill::ListItem;
-My::Web->init_project(
- "ListItem"=>\%My::Project::xbill::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::xbill::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::xbill;
+package project::xbill::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
-our %ListItem=(
+our @ListItem=(
"name"=>"Classic xBill game",
"priority"=>7,
"link-Download from SourceForge.net"=>"http://sourceforge.net/project/showfiles.php?group_id=10700",
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
#! /usr/bin/perl
#
# $Id$
-# Main page of 'My::Project::checkstatic'
+# URL redirector of &My::Web::a_href Perl template.
# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
#
# This program is free software; you can redistribute it and/or modify
use warnings;
use My::Web;
-use project::checkstatic::ListItem;
+use Apache::Constants qw(MOVED);
-My::Web->init_project(
- "ListItem"=>\%My::Project::checkstatic::ListItem,
+my $W=My::Web->init(
+ "header_only"=>1,
+ "args_check"=>{
+ "location"=>'^\w+://',
+ },
);
-
-My::Web->footer();
+$W->{"r"}->status(MOVED);
+$W->{"r"}->header_out("Location"=>$W->{"args"}{"location"});