Made a new improved version of winapi-check in perl.
This commit is contained in:
parent
26e1653017
commit
37fd2d1c85
|
@ -1,49 +0,0 @@
|
|||
#!/bin/sh
|
||||
# This quick and dirty script prints the names of functions that don't have a
|
||||
# WINAPI in its header declaration or don't appear in any .c file at all.
|
||||
# I don't think it's very intelligent to use it when having < 64 MB ;)
|
||||
# FIXME: This script skips .spec function entries that occupy two or more
|
||||
# .spec lines !
|
||||
|
||||
if [ ! -e ./ChangeLog ] ; then
|
||||
echo You are not in Wine main directory !
|
||||
exit
|
||||
fi
|
||||
echo crtdll.spec, ntdll.spec and wsock32.spec will be mentioned many times,
|
||||
echo as they use original UNIX functions that don\'t exist in Wine .c code.
|
||||
echo
|
||||
FIND_LIST="`find . -name "*.c"`"
|
||||
for i in if1632/*.spec relay32/*.spec
|
||||
do
|
||||
# skip wprocs.spec, as it contains many funcs that don't need a WINAPI
|
||||
if [ $i = "if1632/wprocs.spec" ] ; then
|
||||
continue
|
||||
fi
|
||||
LINE="`egrep "stdcall|cdecl|pascal|register" $i|grep -v "^#"|tr -d " "|tr "\n" " "`"
|
||||
for j in $LINE
|
||||
do
|
||||
if [ -n "`echo "$j"|grep \)`" ] ; then
|
||||
FUNC="`echo $j|cut -f2 -d\)|cut -f1 -d'#'`"
|
||||
if [ -n "$FUNC" ] ; then
|
||||
if [ -z "`grep -B 1 $FUNC $FIND_LIST|egrep "WINAPI|__cdecl|VFWAPI|DC_GET_VAL|DC_SET_MODE|REGS_ENTRYPOINT"`" ] ; then
|
||||
case $FUNC in # "black list"
|
||||
"GetBrushOrgEx16" ) ;;
|
||||
"GetCurrentPositionEx16" ) ;;
|
||||
"GetViewportExtEx16" ) ;;
|
||||
"GetViewportOrgEx16" ) ;;
|
||||
"GetWindowExtEx16" ) ;;
|
||||
"GetWindowOrgEx16" ) ;;
|
||||
|
||||
"GetBrushOrgEx32" ) ;;
|
||||
"GetCurrentPositionEx32" ) ;;
|
||||
"GetViewportExtEx32" ) ;;
|
||||
"GetViewportOrgEx32" ) ;;
|
||||
"GetWindowExtEx32" ) ;;
|
||||
"GetWindowOrgEx32" ) ;;
|
||||
* ) echo "$i: $FUNC" ;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
done
|
|
@ -0,0 +1,217 @@
|
|||
__ctype
|
||||
__divdi3
|
||||
__eprintf
|
||||
__fixunsdfdi
|
||||
__flsbuf
|
||||
__iob
|
||||
__moddi3
|
||||
_environ
|
||||
_exit
|
||||
_fxstat
|
||||
_lwp_create
|
||||
_lwp_exit
|
||||
_lwp_makecontext
|
||||
_lxstat
|
||||
_sysconf
|
||||
_xmknod
|
||||
_xstat
|
||||
abs
|
||||
access
|
||||
acos
|
||||
asctime
|
||||
asin
|
||||
atan
|
||||
atan2
|
||||
atexit
|
||||
atof
|
||||
atoi
|
||||
atol
|
||||
bsearch
|
||||
bzero
|
||||
calloc
|
||||
ceil
|
||||
cfgetospeed
|
||||
chmod
|
||||
close
|
||||
closedir
|
||||
cos
|
||||
cosh
|
||||
ctime
|
||||
div
|
||||
dup
|
||||
dup2
|
||||
environ
|
||||
errno
|
||||
execlp
|
||||
execvp
|
||||
exit
|
||||
exp
|
||||
fabs
|
||||
fclose
|
||||
fcntl
|
||||
fdopen
|
||||
feof
|
||||
fflush
|
||||
ffs
|
||||
fgetc
|
||||
fgetpos
|
||||
fgets
|
||||
floor
|
||||
fmod
|
||||
fopen
|
||||
fork
|
||||
fprintf
|
||||
fputc
|
||||
fputs
|
||||
fread
|
||||
free
|
||||
frexp
|
||||
fseek
|
||||
fsetpos
|
||||
fsync
|
||||
ftruncate
|
||||
fwrite
|
||||
getcwd
|
||||
getenv
|
||||
getlogin
|
||||
getnetbyname
|
||||
getpid
|
||||
getpwuid
|
||||
gettimeofday
|
||||
getuid
|
||||
gmtime
|
||||
hypot
|
||||
inet_network
|
||||
ioctl
|
||||
isalnum
|
||||
isalpha
|
||||
isatty
|
||||
iscntrl
|
||||
isdigit
|
||||
isgraph
|
||||
islower
|
||||
isprint
|
||||
ispunct
|
||||
isspace
|
||||
isupper
|
||||
isxdigit
|
||||
j0
|
||||
j1
|
||||
jn
|
||||
kill
|
||||
labs
|
||||
ldexp
|
||||
ldiv
|
||||
localtime
|
||||
log
|
||||
log10
|
||||
longjmp
|
||||
lseek
|
||||
malloc
|
||||
mblen
|
||||
memchr
|
||||
memcmp
|
||||
memcpy
|
||||
memmove
|
||||
memset
|
||||
mkdir
|
||||
mktime
|
||||
mmap
|
||||
modf
|
||||
mprotect
|
||||
msync
|
||||
munmap
|
||||
open
|
||||
opendir
|
||||
perror
|
||||
pipe
|
||||
poll
|
||||
pow
|
||||
printf
|
||||
putchar
|
||||
putenv
|
||||
puts
|
||||
qsort
|
||||
raise
|
||||
rand
|
||||
read
|
||||
readdir
|
||||
realloc
|
||||
remove
|
||||
rename
|
||||
rmdir
|
||||
select
|
||||
setbuf
|
||||
setlocale
|
||||
setsid
|
||||
settimeofday
|
||||
setvbuf
|
||||
shmat
|
||||
shmctl
|
||||
shmdt
|
||||
shmget
|
||||
sigaction
|
||||
sigaddset
|
||||
sigaltstack
|
||||
sigemptyset
|
||||
signal
|
||||
sigprocmask
|
||||
sin
|
||||
sin
|
||||
sinh
|
||||
sleep
|
||||
snprintf
|
||||
sprintf
|
||||
sqrt
|
||||
srand
|
||||
sscanf
|
||||
statfs
|
||||
strcasecmp
|
||||
strcat
|
||||
strchr
|
||||
strcmp
|
||||
strcoll
|
||||
strcpy
|
||||
strcspn
|
||||
strdup
|
||||
strerror
|
||||
strftime
|
||||
strlen
|
||||
strncasecmp
|
||||
strncat
|
||||
strncmp
|
||||
strncpy
|
||||
strpbrk
|
||||
strrchr
|
||||
strspn
|
||||
strstr
|
||||
strtod
|
||||
strtok
|
||||
strtol
|
||||
strtoul
|
||||
strxfrm
|
||||
sysi86
|
||||
system
|
||||
tan
|
||||
tanh
|
||||
tcflush
|
||||
tcgetattr
|
||||
tcsetattr
|
||||
tempnam
|
||||
time
|
||||
times
|
||||
tmpnam
|
||||
tolower
|
||||
toupper
|
||||
towlower
|
||||
towupper
|
||||
unlink
|
||||
usleep
|
||||
utime
|
||||
vfprintf
|
||||
vsprintf
|
||||
wait4
|
||||
write
|
||||
y0
|
||||
y1
|
||||
yn
|
|
@ -0,0 +1,38 @@
|
|||
package nativeapi;
|
||||
|
||||
use strict;
|
||||
|
||||
sub new {
|
||||
my $proto = shift;
|
||||
my $class = ref($proto) || $proto;
|
||||
my $self = {};
|
||||
bless ($self, $class);
|
||||
|
||||
my $functions = \%{$self->{FUNCTIONS}};
|
||||
|
||||
my $file = shift;
|
||||
|
||||
open(IN, "< $file");
|
||||
$/ = "\n";
|
||||
while(<IN>) {
|
||||
s/^\s*?(.*?)\s*$/$1/; # remove whitespace at begin and end of line
|
||||
s/^(.*?)\s*#.*$/$1/; # remove comments
|
||||
/^$/ && next; # skip empty lines
|
||||
|
||||
$$functions{$_} = 1;
|
||||
}
|
||||
close(IN);
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
||||
sub is_function {
|
||||
my $self = shift;
|
||||
my $functions = \%{$self->{FUNCTIONS}};
|
||||
|
||||
my $name = shift;
|
||||
|
||||
return $$functions{$name};
|
||||
}
|
||||
|
||||
1;
|
|
@ -0,0 +1,184 @@
|
|||
package parser;
|
||||
|
||||
BEGIN {
|
||||
use Exporter ();
|
||||
use vars qw(@ISA @EXPORT);
|
||||
|
||||
@ISA = qw(Exporter);
|
||||
@EXPORT = qw(&init
|
||||
&transact &commit &rollback &token
|
||||
&dump_state
|
||||
&either &filter &many &many1 &separate &separate1 &sequence);
|
||||
}
|
||||
|
||||
my @stack;
|
||||
my $current;
|
||||
my $next;
|
||||
|
||||
sub init {
|
||||
@stack = ();
|
||||
$current = [];
|
||||
$next = shift;
|
||||
|
||||
@$next = grep {
|
||||
$_->{type} !~ /^comment|preprocessor$/;
|
||||
} @$next;
|
||||
}
|
||||
|
||||
sub dump_state {
|
||||
print "stack: [\n";
|
||||
for my $tokens (@stack) {
|
||||
print " [\n";
|
||||
for my $token (@$tokens) {
|
||||
print " " . $token->{type} . ": " . $token->{data} . "\n";
|
||||
}
|
||||
print " ]\n";
|
||||
}
|
||||
print "]\n";
|
||||
print "current: [\n";
|
||||
for my $token (@$current) {
|
||||
print " " . $token->{type} . ": " . $token->{data} . "\n";
|
||||
}
|
||||
print "]\n";
|
||||
print "next: [\n";
|
||||
for my $token (@$next) {
|
||||
print " " . $token->{type} . ": " . $token->{data} . "\n";
|
||||
}
|
||||
print "]\n";
|
||||
}
|
||||
|
||||
sub token {
|
||||
my $token = shift @$next;
|
||||
push @$current, $token;
|
||||
return $token;
|
||||
};
|
||||
|
||||
sub transact {
|
||||
push @stack, $current;
|
||||
$current = [];
|
||||
}
|
||||
|
||||
sub commit {
|
||||
my $oldcurrent = $current;
|
||||
$current = pop @stack;
|
||||
push @$current, @$oldcurrent;
|
||||
}
|
||||
|
||||
sub rollback {
|
||||
unshift @$next, @$current;
|
||||
$current = pop @stack;
|
||||
}
|
||||
|
||||
sub filter {
|
||||
my $parser = shift;
|
||||
my $filter = shift;
|
||||
|
||||
transact;
|
||||
my $r1 = &$parser;
|
||||
if(defined($r1)) {
|
||||
my $r2 = &$filter($r1);
|
||||
if($r2) {
|
||||
commit;
|
||||
return $r1;
|
||||
} else {
|
||||
rollback;
|
||||
return undef;
|
||||
}
|
||||
} else {
|
||||
rollback;
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
|
||||
sub either {
|
||||
for my $parser (@_) {
|
||||
transact;
|
||||
my $r = &$parser;
|
||||
if(defined($r)) {
|
||||
commit;
|
||||
return $r;
|
||||
} else {
|
||||
rollback;
|
||||
}
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub sequence {
|
||||
transact;
|
||||
my $rs = [];
|
||||
for my $parser (@_) {
|
||||
my $r = &$parser;
|
||||
if(defined($r)) {
|
||||
push @$rs, $r;
|
||||
} else {
|
||||
rollback;
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
commit;
|
||||
return $rs;
|
||||
}
|
||||
|
||||
sub separate {
|
||||
my $parser = shift;
|
||||
my $separator = shift;
|
||||
my $rs = [];
|
||||
while(1) {
|
||||
my $r = &$parser;
|
||||
if(defined($r)) {
|
||||
push @$rs, $r;
|
||||
} else {
|
||||
last;
|
||||
}
|
||||
my $s = &$separator;
|
||||
if(!defined($r)) {
|
||||
last;
|
||||
}
|
||||
|
||||
}
|
||||
return $rs;
|
||||
}
|
||||
|
||||
sub separate1 {
|
||||
my $parser = shift;
|
||||
my $separator = shift;
|
||||
transact;
|
||||
my $rs = separate($parser,$separator);
|
||||
if($#$rs != -1) {
|
||||
commit;
|
||||
return $rs;
|
||||
} else {
|
||||
rollback;
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
|
||||
sub many {
|
||||
my $parser = shift;
|
||||
my $rs = [];
|
||||
while(1) {
|
||||
my $r = &$parser;
|
||||
if(defined($r)) {
|
||||
push @$rs, $r;
|
||||
} else {
|
||||
last;
|
||||
}
|
||||
}
|
||||
return $rs;
|
||||
}
|
||||
|
||||
sub many1 {
|
||||
my $parser = shift;
|
||||
transact;
|
||||
my $rs = many($parser);
|
||||
if($#$rs != -1) {
|
||||
commit;
|
||||
return $rs;
|
||||
} else {
|
||||
rollback;
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
|
@ -0,0 +1,348 @@
|
|||
%long
|
||||
|
||||
COLORREF
|
||||
DWORD
|
||||
FOURCC
|
||||
HCONV
|
||||
HCONVLIST
|
||||
HDDEDATA
|
||||
HHOOK
|
||||
HKEY
|
||||
HRESULT
|
||||
HSZ
|
||||
LCID
|
||||
LCTYPE
|
||||
LHCLIENTDOC
|
||||
LHSERVER
|
||||
LHSERVERDOC
|
||||
LONG
|
||||
LPARAM
|
||||
LRESULT
|
||||
POINT16
|
||||
ULONG
|
||||
|
||||
%longlong
|
||||
|
||||
LARGE_INTEGER
|
||||
|
||||
%ptr
|
||||
|
||||
ACMDRIVERENUMCB16
|
||||
ACMFILTERENUMCB16
|
||||
ACMFILTERTAGENUMCB16
|
||||
ACMFORMATENUMCB16
|
||||
ACMFORMATTAGENUMCB16
|
||||
BITMAP16 *
|
||||
BITMAPINFO *
|
||||
BITMAPINFOHEADER *
|
||||
BOOL16 *
|
||||
BSTR16 *
|
||||
CLASSENTRY *
|
||||
CLSID *
|
||||
COLORREF *
|
||||
CONTEXT86 *
|
||||
CURSORICONINFO *
|
||||
DEVMODEA *
|
||||
DOCINFO16 *
|
||||
DWORD *
|
||||
FARPROC *
|
||||
FARPROC16 *
|
||||
FILETIME *
|
||||
GLOBALENTRY *
|
||||
GLOBALINFO *
|
||||
GUID *
|
||||
HANDLE *
|
||||
HANDLETABLE16 *
|
||||
HHOOK *
|
||||
HICON16 *
|
||||
HINSTANCE16 *
|
||||
HMIDIIN16 *
|
||||
HMIDIOUT16 *
|
||||
HMIDISTRM16 *
|
||||
HPCSTR
|
||||
HPSTR
|
||||
HTASK16 *
|
||||
HWAVEIN16 *
|
||||
HWAVEOUT16 *
|
||||
IID *
|
||||
IMalloc16 *
|
||||
INT16 *
|
||||
INTERFACEDATA *
|
||||
IStorage16 *
|
||||
IStorage16 **
|
||||
IStream16 *
|
||||
IStream16 **
|
||||
ITypeInfo **
|
||||
IUnknown *
|
||||
LHCLIENTDOC *
|
||||
LHSERVERDOC *
|
||||
LOCAL32ENTRY *
|
||||
LOCAL32INFO *
|
||||
LOCALENTRY *
|
||||
LOCALINFO *
|
||||
LOGBRUSH16 *
|
||||
LOGFONT16 *
|
||||
LOGPALETTE *
|
||||
LOGPEN16 *
|
||||
LPABC16
|
||||
LPACMDRIVERDETAILS16
|
||||
LPACMFILTERCHOOSE16
|
||||
LPACMFILTERDETAILS16
|
||||
LPACMFILTERTAGDETAILS16
|
||||
LPACMFORMATCHOOSE16
|
||||
LPACMFORMATDETAILS16
|
||||
LPACMFORMATTAGDETAILS16
|
||||
LPACMSTREAMHEADER16
|
||||
LPAUXCAPS16
|
||||
LPBSTR16
|
||||
LPBYTE
|
||||
LPCATCHBUF
|
||||
LPCHOOSECOLOR16
|
||||
LPCHOOSEFONT16
|
||||
LPCLSID
|
||||
LPCOMSTAT16
|
||||
LPCONVCONTEXT16
|
||||
LPCONVINFO16
|
||||
LPCURSORINFO
|
||||
LPCVOID
|
||||
LPDCB16
|
||||
LPDEVMODEA
|
||||
LPDRIVERINFOSTRUCT16
|
||||
LPDWORD
|
||||
LPENUMLOGFONT16
|
||||
LPFILETIME
|
||||
LPFONTINFO16
|
||||
LPGLYPHMETRICS16
|
||||
LPHACMDRIVER16
|
||||
LPHACMDRIVERID16
|
||||
LPHACMSTREAM16
|
||||
LPHANDLE
|
||||
LPHKEY
|
||||
LPHMIXER16
|
||||
LPICONINFO16
|
||||
LPINT16
|
||||
LPJOYCAPS16
|
||||
LPJOYINFO16
|
||||
LPKERNINGPAIR16
|
||||
LPLOGFONT16
|
||||
LPMALLOC16 *
|
||||
LPMEMORY_BASIC_INFORMATION
|
||||
LPMESSAGEFILTER
|
||||
LPMESSAGEFILTER *
|
||||
LPMIDIHDR16
|
||||
LPMIDIINCAPS16
|
||||
LPMIDIOUTCAPS16
|
||||
LPMIXERCAPS16
|
||||
LPMIXERCONTROLDETAILS16
|
||||
LPMIXERLINE16
|
||||
LPMIXERLINECONTROLS16
|
||||
LPMMCKINFO
|
||||
LPMMIOPROC16
|
||||
LPMMTIME16
|
||||
LPMONIKER *
|
||||
LPMSG16
|
||||
LPMSG16_32
|
||||
LPMSGBOXPARAMS16
|
||||
LPNEWTEXTMETRIC16
|
||||
LPOFSTRUCT
|
||||
LPOLECLIENT
|
||||
LPOLEOBJECT
|
||||
LPOLEOBJECT *
|
||||
LPOLESERVERDOC
|
||||
LPOLESTR16 *
|
||||
LPDROPTARGET
|
||||
LPOUTLINETEXTMETRIC16
|
||||
LPPAINTSTRUCT16
|
||||
LPPALETTEENTRY
|
||||
LPPDEVICE
|
||||
LPPOINT16
|
||||
LPQUEUESTRUCT16 *
|
||||
LPRASTERIZER_STATUS
|
||||
LPRECT16
|
||||
LPRGNDATA
|
||||
LPRUNNINGOBJECTTABLE *
|
||||
LPSCROLLINFO
|
||||
LPSIZE16
|
||||
LPSTORAGE16
|
||||
LPTEXTXFORM16
|
||||
LPTIMECAPS16
|
||||
LPUINT16
|
||||
LPUNKNOWN
|
||||
LPVOID
|
||||
LPVOID *
|
||||
LPWAVEFILTER
|
||||
LPWAVEFORMATEX
|
||||
LPWAVEINCAPS16
|
||||
LPWAVEOUTCAPS16
|
||||
LPWIN32SINFO
|
||||
LPWORD
|
||||
LPWSADATA
|
||||
MAT2 *
|
||||
MEMMANINFO *
|
||||
MENUITEMINFO16 *
|
||||
METARECORD *
|
||||
MIDIHDR16 *
|
||||
MMCKINFO *
|
||||
MMIOINFO16 *
|
||||
MODULEENTRY *
|
||||
MSG16 *
|
||||
MSG32_16 *
|
||||
OFSTRUCT *
|
||||
OSVERSIONINFO16 *
|
||||
PAINTSTRUCT16 *
|
||||
PALETTEENTRY *
|
||||
POINT16 *
|
||||
RECT16 *
|
||||
REFCLSID
|
||||
REFGUID
|
||||
REFIID
|
||||
RGBQUAD *
|
||||
SCROLLINFO *
|
||||
SECURITY_ATTRIBUTES *
|
||||
SEGINFO *
|
||||
SEGPTR *
|
||||
SNB16
|
||||
STACKTRACEENTRY *
|
||||
STATSTG16 *
|
||||
SYSHEAPINFO *
|
||||
SYSLEVEL *
|
||||
TASKENTRY *
|
||||
TEXTMETRIC16 *
|
||||
THUNKLET *
|
||||
TIMERINFO *
|
||||
UINT16 *
|
||||
ULARGE_INTEGER *
|
||||
ULONG *
|
||||
VOID *
|
||||
WAVEHDR *
|
||||
WIN32_FIND_DATAA *
|
||||
WINDEBUGINFO *
|
||||
WINDOWPLACEMENT16 *
|
||||
WNDCLASS16 *
|
||||
WNDCLASSEX16 *
|
||||
WORD *
|
||||
char *
|
||||
struct ThunkDataCommon *
|
||||
struct Win87EmInfoStruct *
|
||||
struct sockaddr *
|
||||
struct tagCURSORICONINFO *
|
||||
struct timeval *
|
||||
void *
|
||||
ws_fd_set16 *
|
||||
|
||||
%s_word
|
||||
|
||||
INT16
|
||||
|
||||
%segptr
|
||||
|
||||
DLGPROC16
|
||||
FARPROC16
|
||||
FONTENUMPROC16
|
||||
FONTENUMPROCEX16
|
||||
GOBJENUMPROC16
|
||||
GRAYSTRINGPROC16
|
||||
HOOKPROC16
|
||||
LINEDDAPROC16
|
||||
LPTIMECALLBACK16
|
||||
MFENUMPROC16
|
||||
PROPENUMPROC16
|
||||
SEGPTR
|
||||
TIMERPROC16
|
||||
WNDENUMPROC16
|
||||
WNDPROC16
|
||||
|
||||
%segstr
|
||||
|
||||
BSTR16
|
||||
|
||||
%str
|
||||
|
||||
LPCOLESTR16
|
||||
LPCSTR
|
||||
LPCWSTR
|
||||
LPSTR
|
||||
LPOLESTR16
|
||||
|
||||
%unknown
|
||||
|
||||
struct in_addr
|
||||
|
||||
%void
|
||||
|
||||
void
|
||||
VOID
|
||||
|
||||
%word
|
||||
|
||||
ATOM
|
||||
BOOL16
|
||||
BYTE
|
||||
CHAR
|
||||
HACCEL16
|
||||
HACMDRIVER16
|
||||
HACMDRIVERID16
|
||||
HACMOBJ16
|
||||
HACMSTREAM16
|
||||
HANDLE16
|
||||
HBITMAP16
|
||||
HBRUSH16
|
||||
HCURSOR16
|
||||
HDC16
|
||||
HDROP16
|
||||
HDRVR16
|
||||
HDWP16
|
||||
HFILE16
|
||||
HFONT16
|
||||
HGDIOBJ16
|
||||
HGLOBAL16
|
||||
HICON16
|
||||
HINSTANCE16
|
||||
HLOCAL16
|
||||
HMENU16
|
||||
HMETAFILE16
|
||||
HMIDIIN16
|
||||
HMIDIOUT16
|
||||
HMIDISTRM16
|
||||
HMIXER16
|
||||
HMIXEROBJ16
|
||||
HMMIO16
|
||||
HMODULE16
|
||||
HPALETTE16
|
||||
HPEN16
|
||||
HPJOB16
|
||||
HPQ16
|
||||
HQUEUE16
|
||||
HRGN16
|
||||
HRSRC16
|
||||
HTASK16
|
||||
HWAVEIN16
|
||||
HWAVEOUT16
|
||||
HWND16
|
||||
LANGID
|
||||
MMRESULT16
|
||||
OLESTATUS
|
||||
SOCKET16
|
||||
UINT16
|
||||
WING_DITHER_TYPE
|
||||
WORD
|
||||
WPARAM16
|
||||
|
||||
%unknown --forbidden
|
||||
|
||||
BOOL
|
||||
FARPROC
|
||||
HANDLE
|
||||
HINSTANCE
|
||||
HMODULE
|
||||
HWND
|
||||
INT
|
||||
LPOLESTR
|
||||
UINT
|
||||
YIELDPROC
|
||||
int
|
||||
long
|
||||
short
|
||||
u_long
|
||||
u_short
|
||||
unsigned
|
|
@ -0,0 +1,785 @@
|
|||
%double
|
||||
|
||||
CY
|
||||
double
|
||||
|
||||
%long
|
||||
|
||||
ACCESS_MASK
|
||||
ATOM
|
||||
BOOL
|
||||
BOOLEAN
|
||||
BYTE
|
||||
CALID
|
||||
CALTYPE
|
||||
CHAR
|
||||
CLIPFORMAT
|
||||
COLORREF
|
||||
COORD
|
||||
DATE
|
||||
DIGEST_HANDLE
|
||||
DPAENUMPROC
|
||||
DWORD
|
||||
FILE_INFORMATION_CLASS
|
||||
FLOAT
|
||||
FOURCC
|
||||
FS_INFORMATION_CLASS
|
||||
GET_FILEEX_INFO_LEVELS
|
||||
HACCEL
|
||||
HACMDRIVER
|
||||
HACMDRIVERID
|
||||
HACMOBJ
|
||||
HACMSTREAM
|
||||
HANDLE
|
||||
HBITMAP
|
||||
HBRUSH
|
||||
HCALL
|
||||
HCOLORSPACE
|
||||
HCONV
|
||||
HCONVLIST
|
||||
HCURSOR
|
||||
HCRYPTKEY
|
||||
HDC
|
||||
HDDEDATA
|
||||
HDESK
|
||||
HDROP
|
||||
HDRVR
|
||||
HDSA
|
||||
HDWP
|
||||
HENHMETAFILE
|
||||
HFILE
|
||||
HFONT
|
||||
HGDIOBJ
|
||||
HGLOBAL
|
||||
HHOOK
|
||||
HIC
|
||||
HICON
|
||||
HIMC
|
||||
HINSTANCE
|
||||
HKEY
|
||||
HKL
|
||||
HLINE
|
||||
HLINEAPP
|
||||
HLOCAL
|
||||
HMENU
|
||||
HMETAFILE
|
||||
HMIDIIN
|
||||
HMIDIOUT
|
||||
HMIDISTRM
|
||||
HMIXER
|
||||
HMIXEROBJ
|
||||
HMMIO
|
||||
HMODULE
|
||||
HMONITOR
|
||||
HOLEMENU
|
||||
HPALETTE
|
||||
HPEN
|
||||
HPHONE
|
||||
HPHONEAPP
|
||||
HPROPSHEETPAGE
|
||||
HPROVIDER
|
||||
HRESULT
|
||||
HRGN
|
||||
HRSRC
|
||||
HSZ
|
||||
HTASK
|
||||
HWAVEIN
|
||||
HWAVEOUT
|
||||
HWINSTA
|
||||
HWND
|
||||
INT
|
||||
KEY_INFORMATION_CLASS
|
||||
KEY_VALUE_INFORMATION_CLASS
|
||||
LANGID
|
||||
LCID
|
||||
LCTYPE
|
||||
LHCLIENTDOC
|
||||
LHSERVER
|
||||
LHSERVERDOC
|
||||
LONG
|
||||
LPARAM
|
||||
LRESULT
|
||||
MMRESULT
|
||||
NTSTATUS
|
||||
OBJECT_INFORMATION_CLASS
|
||||
OLECLIPFORMAT
|
||||
OLEOPT_RENDER
|
||||
OLESTATUS
|
||||
OLE_SERVER_USE
|
||||
OUT
|
||||
PHANDLE
|
||||
PHPROVIDER
|
||||
PIO_APC_ROUTINE
|
||||
PLSA_HANDLE
|
||||
PLSA_OBJECT_ATTRIBUTES
|
||||
PLSA_UNICODE_STRING
|
||||
POBJDIR_INFORMATION
|
||||
PROCESSINFOCLASS
|
||||
PTIME_FIELDS
|
||||
PTOKEN_PRIVILEGES
|
||||
REGSAM
|
||||
SC_HANDLE
|
||||
SECTION_INHERIT
|
||||
SECURITY_IMPERSONATION_LEVEL
|
||||
SECURITY_INFORMATION
|
||||
SEGPTR
|
||||
SERVICE_STATUS_HANDLE
|
||||
SHORT
|
||||
SOCKET
|
||||
SYSKIND
|
||||
SYSTEM_INFORMATION_CLASS
|
||||
THREADINFOCLASS
|
||||
TIMER_TYPE
|
||||
TOKEN_INFORMATION_CLASS
|
||||
TOKEN_TYPE
|
||||
UINT
|
||||
ULONG
|
||||
ULONG_PTR
|
||||
USHORT
|
||||
VARIANT_BOOL
|
||||
VARTYPE
|
||||
WCHAR
|
||||
WORD
|
||||
WOW_HANDLE_TYPE
|
||||
WPARAM
|
||||
clock_t
|
||||
enum NOTIFYTYPE
|
||||
time_t
|
||||
|
||||
%longlong
|
||||
|
||||
LARGE_INTEGER
|
||||
POINT
|
||||
|
||||
%ptr
|
||||
|
||||
ABORTPROC
|
||||
ACMDRIVERENUMCB
|
||||
ACMFILTERENUMCBA
|
||||
ACMFILTERENUMCBW
|
||||
ACMFILTERTAGENUMCBA
|
||||
ACMFILTERTAGENUMCBW
|
||||
ACMFORMATENUMCBA
|
||||
ACMFORMATENUMCBW
|
||||
ACMFORMATTAGENUMCBA
|
||||
ACMFORMATTAGENUMCBW
|
||||
AVICOMPRESSOPTIONS *
|
||||
AVISTREAMINFOA *
|
||||
AVISTREAMINFOW *
|
||||
BITMAP *
|
||||
BITMAPINFO *
|
||||
BITMAPINFOHEADER *
|
||||
BOOL *
|
||||
BSTR *
|
||||
BYTE *
|
||||
BY_HANDLE_FILE_INFORMATION *
|
||||
CALINFO_ENUMPROCA
|
||||
CHAR *
|
||||
CLIPFORMAT *
|
||||
CLSID *
|
||||
CODEPAGE_ENUMPROCA
|
||||
CODEPAGE_ENUMPROCW
|
||||
COLORADJUSTMENT *
|
||||
COLORREF *
|
||||
CONST
|
||||
CONTEXT *
|
||||
COSERVERINFO *
|
||||
CRITICAL_SECTION *
|
||||
CRTDLL_FILE *
|
||||
CY *
|
||||
DATE *
|
||||
DATEFMT_ENUMPROCA
|
||||
DATEFMT_ENUMPROCW
|
||||
DEVMODEA *
|
||||
DEVMODEW *
|
||||
DIGEST_FUNCTION
|
||||
DLGPROC
|
||||
DLLVERSIONINFO *
|
||||
DOCINFOA *
|
||||
DOCINFOW *
|
||||
DPALOADPROC
|
||||
DRAWSTATEPROC
|
||||
DSAENUMPROC
|
||||
DWORD *
|
||||
ENHMETARECORD *
|
||||
ENHMFENUMPROC
|
||||
ENUMRESLANGPROCA
|
||||
ENUMRESLANGPROCW
|
||||
ENUMRESNAMEPROCA
|
||||
ENUMRESNAMEPROCW
|
||||
ENUMRESTYPEPROCA
|
||||
ENUMRESTYPEPROCW
|
||||
EXCEPTION_RECORD *
|
||||
FARPROC
|
||||
FARPROC *
|
||||
FILETIME *
|
||||
FLOAT *
|
||||
FONTENUMPROCA
|
||||
FONTENUMPROCEXA
|
||||
FONTENUMPROCEXW
|
||||
FONTENUMPROCW
|
||||
GCP_RESULTSA *
|
||||
GCP_RESULTSW *
|
||||
GOBJENUMPROC
|
||||
GRAYSTRINGPROC
|
||||
GUID *
|
||||
HANDLE *
|
||||
HANDLER_ROUTINE *
|
||||
HANDLETABLE *
|
||||
HCRYPTPROV *
|
||||
HDPA
|
||||
HDPA *
|
||||
HGLOBAL *
|
||||
HICON *
|
||||
HIMAGELIST
|
||||
HIMAGELIST *
|
||||
HKL *
|
||||
HMENU *
|
||||
HMIDIIN *
|
||||
HMIDIOUT *
|
||||
HMIDISTRM *
|
||||
HMRU
|
||||
HOOKPROC
|
||||
HPCSTR
|
||||
HPSTR
|
||||
HWAVEIN *
|
||||
HWAVEOUT *
|
||||
HWND *
|
||||
ICINFO *
|
||||
IDSTRUCT *
|
||||
IDataObject *
|
||||
IDataObject **
|
||||
IDropSource *
|
||||
IDropTarget *
|
||||
ILockBytes *
|
||||
IMAGEINFO *
|
||||
IMAGELISTDRAWPARAMS *
|
||||
INPUT_RECORD *
|
||||
INT *
|
||||
IPersistStream *
|
||||
IShellFolder **
|
||||
IStorage *
|
||||
IStorage **
|
||||
IStream *
|
||||
ITypeLib *
|
||||
ITypeLib **
|
||||
IUnknown *
|
||||
LHCLIENTDOC *
|
||||
LHSERVER *
|
||||
LHSERVERDOC *
|
||||
LINECALLBACK
|
||||
LINEDDAPROC
|
||||
LOCALE_ENUMPROCA
|
||||
LOCALE_ENUMPROCW
|
||||
LOGBRUSH *
|
||||
LOGFONTA *
|
||||
LOGFONTW *
|
||||
LOGPALETTE *
|
||||
LOGPEN *
|
||||
LONG *
|
||||
LPABC
|
||||
LPABCFLOAT
|
||||
LPACCEL
|
||||
LPAUTHDLGSTRUCTA
|
||||
LPAUXCAPSA
|
||||
LPAUXCAPSW
|
||||
LPAVIFILEINFOA
|
||||
LPAVIFILEINFOW
|
||||
LPBC *
|
||||
LPBITMAPINFOHEADER
|
||||
LPBOOL
|
||||
LPBROWSEINFOA
|
||||
LPBSTR
|
||||
LPBYTE
|
||||
LPCANDIDATEFORM
|
||||
LPCANDIDATELIST
|
||||
LPCHARSETINFO
|
||||
LPCHAR_INFO
|
||||
LPCHOOSECOLORA
|
||||
LPCHOOSECOLORW
|
||||
LPCHOOSEFONTA
|
||||
LPCHOOSEFONTW
|
||||
LPCITEMIDLIST
|
||||
LPCITEMIDLIST *
|
||||
LPCLSID
|
||||
LPCMENUINFO
|
||||
LPCOLDTBBUTTON
|
||||
LPCOLORADJUSTMENT
|
||||
LPCOLORMAP
|
||||
LPCOMMTIMEOUTS
|
||||
LPCOMPOSITIONFORM
|
||||
LPCOMSTAT
|
||||
LPCONNECTDLGSTRUCTA
|
||||
LPCONNECTDLGSTRUCTW
|
||||
LPCONSOLE_CURSOR_INFO
|
||||
LPCONSOLE_SCREEN_BUFFER_INFO
|
||||
LPCONVCONTEXT
|
||||
LPCONVINFO
|
||||
LPCPINFO
|
||||
LPCPROPSHEETHEADERA
|
||||
LPCPROPSHEETHEADERW
|
||||
LPCPROPSHEETPAGEA
|
||||
LPCPROPSHEETPAGEW
|
||||
LPCSTR *
|
||||
LPCTBBUTTON
|
||||
LPCVOID
|
||||
LPCWSTR *
|
||||
LPDATAADVISEHOLDER *
|
||||
LPDATAOBJECT
|
||||
LPDCB
|
||||
LPDDENUMCALLBACKA
|
||||
LPDDENUMCALLBACKEXA
|
||||
LPDDENUMCALLBACKEXW
|
||||
LPDDENUMCALLBACKW
|
||||
LPDEBUG_EVENT
|
||||
LPDEVMODEA
|
||||
LPDEVMODEW
|
||||
LPDIRECTDRAW *
|
||||
LPDIRECTDRAWCLIPPER *
|
||||
LPDIRECTPLAYLOBBY *
|
||||
LPDIRECTPLAYLOBBYA *
|
||||
LPDIRECTSOUND *
|
||||
LPDISCDLGSTRUCTA
|
||||
LPDISCDLGSTRUCTW
|
||||
LPDPENUMDPCALLBACKA
|
||||
LPDPENUMDPCALLBACKW
|
||||
LPDRAWITEMSTRUCT
|
||||
LPDRAWTEXTPARAMS
|
||||
LPDROPTARGET
|
||||
LPDSENUMCALLBACKA
|
||||
LPDWORD
|
||||
LPENHMETAHEADER
|
||||
LPENUMFORMATETC *
|
||||
LPENUMOLEVERB *
|
||||
LPENUM_SERVICE_STATUSA
|
||||
LPFILETIME
|
||||
LPFINDREPLACEA
|
||||
LPFINDREPLACEW
|
||||
LPFNCREATEINSTANCE
|
||||
LPFNFMCALLBACK
|
||||
LPFONTDESC
|
||||
LPFONTSIGNATURE
|
||||
LPFORMATETC
|
||||
LPGLYPHMETRICS
|
||||
LPGUID
|
||||
LPHANDLE
|
||||
LPHANDLER_FUNCTION
|
||||
LPHANDLETABLE
|
||||
LPHCALL
|
||||
LPHKEY
|
||||
LPHLINE
|
||||
LPHLINEAPP
|
||||
LPHMIXER
|
||||
LPHPHONE
|
||||
LPHPHONEAPP
|
||||
LPICONINFO
|
||||
LPINITCOMMONCONTROLSEX
|
||||
LPINPUT_RECORD
|
||||
LPINT
|
||||
LPITEMIDLIST *
|
||||
LPITEMIDLIST
|
||||
LPJOYCAPSA
|
||||
LPJOYCAPSW
|
||||
LPJOYINFO
|
||||
LPJOYINFOEX
|
||||
LPKERNINGPAIR
|
||||
LPLDT_ENTRY
|
||||
LPLINEADDRESSCAPS
|
||||
LPLINEADDRESSSTATUS
|
||||
LPLINECALLINFO
|
||||
LPLINECALLLIST
|
||||
LPLINECALLPARAMS
|
||||
LPLINECALLSTATUS
|
||||
LPLINECOUNTRYLIST
|
||||
LPLINEDEVCAPS
|
||||
LPLINEDEVSTATUS
|
||||
LPLINEDIALPARAMS
|
||||
LPLINEEXTENSIONID
|
||||
LPLINEFORWARDLIST
|
||||
LPLINEGENERATETONE
|
||||
LPLINEMEDIACONTROLCALLSTATE
|
||||
LPLINEMEDIACONTROLDIGIT
|
||||
LPLINEMEDIACONTROLMEDIA
|
||||
LPLINEMEDIACONTROLTONE
|
||||
LPLINEMONITORTONE
|
||||
LPLINEPROVIDERLIST
|
||||
LPLINETRANSLATECAPS
|
||||
LPLINETRANSLATEOUTPUT
|
||||
LPLOCKBYTES *
|
||||
LPLOGFONTA
|
||||
LPLOGFONTW
|
||||
LPLONG
|
||||
LPMALLOC *
|
||||
LPMEASUREITEMSTRUCT
|
||||
LPMEMORYSTATUS
|
||||
LPMEMORY_BASIC_INFORMATION
|
||||
LPMENUINFO
|
||||
LPMENUITEMINFOA
|
||||
LPMENUITEMINFOW
|
||||
LPMESSAGEFILTER
|
||||
LPMESSAGEFILTER *
|
||||
LPMIDIHDR
|
||||
LPMIDIINCAPSA
|
||||
LPMIDIINCAPSW
|
||||
LPMIDIOUTCAPSA
|
||||
LPMIDIOUTCAPSW
|
||||
LPMIXERCAPSA
|
||||
LPMIXERCAPSW
|
||||
LPMIXERCONTROLDETAILS
|
||||
LPMIXERLINEA
|
||||
LPMIXERLINECONTROLSA
|
||||
LPMIXERLINECONTROLSW
|
||||
LPMIXERLINEW
|
||||
LPMMCKINFO
|
||||
LPMMIOPROC
|
||||
LPMMTIME
|
||||
LPMODULEENTRY
|
||||
LPMONIKER
|
||||
LPMONIKER *
|
||||
LPMONITORINFO
|
||||
LPMRUINFO
|
||||
LPMSG
|
||||
LPMSGBOXPARAMSA
|
||||
LPMSGBOXPARAMSW
|
||||
LPNETCONNECTINFOSTRUCT
|
||||
LPNETINFOSTRUCT
|
||||
LPNETRESOURCEA
|
||||
LPNETRESOURCEW
|
||||
LPNMHDR
|
||||
LPOFSTRUCT
|
||||
LPOLEADVISEHOLDER *
|
||||
LPOLECLIENT
|
||||
LPOLECLIENTSITE
|
||||
LPOLEINPLACEACTIVEOBJECT
|
||||
LPOLEINPLACEFRAME
|
||||
LPOLEINPLACEFRAMEINFO
|
||||
LPOLEMENUGROUPWIDTHS
|
||||
LPOLEOBJECT
|
||||
LPOLEOBJECT *
|
||||
LPOLESERVER
|
||||
LPOLESERVERDOC
|
||||
LPOLESTR
|
||||
LPOLESTR *
|
||||
LPOLEUIBUSYA
|
||||
LPOLEUIBUSYW
|
||||
LPOLEUICHANGEICONA
|
||||
LPOLEUICHANGEICONW
|
||||
LPOLEUICHANGESOURCEA
|
||||
LPOLEUICHANGESOURCEW
|
||||
LPOLEUICONVERTA
|
||||
LPOLEUICONVERTW
|
||||
LPOLEUIEDITLINKSA
|
||||
LPOLEUIEDITLINKSW
|
||||
LPOLEUIINSERTOBJECTA
|
||||
LPOLEUIINSERTOBJECTW
|
||||
LPOLEUILINKCONTAINERA
|
||||
LPOLEUIOBJECTPROPSA
|
||||
LPOLEUIOBJECTPROPSW
|
||||
LPOLEUIPASTESPECIALA
|
||||
LPOLEUIPASTESPECIALW
|
||||
LPOPENFILENAMEA
|
||||
LPOPENFILENAMEW
|
||||
LPOUTLINETEXTMETRICA
|
||||
LPOUTLINETEXTMETRICW
|
||||
LPOVERLAPPED
|
||||
LPOVERLAPPED_COMPLETION_ROUTINE
|
||||
LPPAGESETUPDLGA
|
||||
LPPALETTEENTRY
|
||||
LPPERSISTSTORAGE
|
||||
LPPHONEBUTTONINFO
|
||||
LPPHONECAPS
|
||||
LPPHONEEXTENSIONID
|
||||
LPPHONESTATUS
|
||||
LPPIXELFORMATDESCRIPTOR
|
||||
LPPOINT
|
||||
LPPRINTDLGA
|
||||
LPPRINTDLGW
|
||||
LPPRINTER_DEFAULTSA
|
||||
LPPRINTER_DEFAULTSW
|
||||
LPPROCESSENTRY
|
||||
LPPROCESS_HEAP_ENTRY *
|
||||
LPPROCESS_INFORMATION
|
||||
LPPROGRESS_ROUTINE
|
||||
LPRASCONNA
|
||||
LPRASTERIZER_STATUS
|
||||
LPRECT
|
||||
LPRGNDATA
|
||||
LPRTL_RWLOCK
|
||||
LPRUNNINGOBJECTTABLE *
|
||||
LPSCROLLINFO
|
||||
LPSECURITY_ATTRIBUTES
|
||||
LPSERVICE_STATUS
|
||||
LPSERVICE_TABLE_ENTRYA
|
||||
LPSERVICE_TABLE_ENTRYW
|
||||
LPSHELLEXECUTEINFOA
|
||||
LPSHELLEXECUTEINFOW
|
||||
LPSHELLFLAGSTATE
|
||||
LPSHELLFOLDER
|
||||
LPSHELLVIEWDATA
|
||||
LPSHFILEOPSTRUCTA
|
||||
LPSHFILEOPSTRUCTW
|
||||
LPSIZE
|
||||
LPSMALL_RECT
|
||||
LPSRB
|
||||
LPSTARTUPINFOA
|
||||
LPSTARTUPINFOW
|
||||
LPSTORAGE
|
||||
LPSTR *
|
||||
LPSTR **
|
||||
LPSTREAM
|
||||
LPSTREAM *
|
||||
LPSTRRET
|
||||
LPSTYLEBUFA
|
||||
LPSTYLEBUFW
|
||||
LPSYSTEMTIME
|
||||
LPSYSTEM_INFO
|
||||
LPSYSTEM_POWER_STATUS
|
||||
LPTHREAD_START_ROUTINE
|
||||
LPTIMECALLBACK
|
||||
LPTIMECAPS
|
||||
LPTIME_ZONE_INFORMATION
|
||||
LPTOP_LEVEL_EXCEPTION_FILTER
|
||||
LPTPMPARAMS
|
||||
LPUINT
|
||||
LPUNKNOWN
|
||||
LPUNKNOWN *
|
||||
LPVARSTRING
|
||||
LPVOID
|
||||
LPVOID *
|
||||
LPWAVEFORMATEX
|
||||
LPWAVEINCAPSA
|
||||
LPWAVEINCAPSW
|
||||
LPWAVEOUTCAPSA
|
||||
LPWAVEOUTCAPSW
|
||||
LPWORD
|
||||
LPWSADATA
|
||||
LPWSTR *
|
||||
LPXFORM
|
||||
MAT2 *
|
||||
MENUITEMINFOA *
|
||||
MENUITEMINFOW *
|
||||
METARECORD *
|
||||
MFENUMPROC
|
||||
MIDIHDR *
|
||||
MMCKINFO *
|
||||
MMIOINFO *
|
||||
MONITORENUMPROC
|
||||
MSG *
|
||||
MULTI_QI *
|
||||
NOTIFYCALLBACK
|
||||
NUMBERFMTA *
|
||||
NUMBERFMTW *
|
||||
OFSTRUCT *
|
||||
OSVERSIONINFOA *
|
||||
OSVERSIONINFOW *
|
||||
PACE_HEADER
|
||||
PACE_HEADER *
|
||||
PACL
|
||||
PACL *
|
||||
PACMDRIVERDETAILSA
|
||||
PACMDRIVERDETAILSW
|
||||
PACMFILTERCHOOSEA
|
||||
PACMFILTERCHOOSEW
|
||||
PACMFILTERDETAILSA
|
||||
PACMFILTERDETAILSW
|
||||
PACMFILTERTAGDETAILSA
|
||||
PACMFILTERTAGDETAILSW
|
||||
PACMFORMATCHOOSEA
|
||||
PACMFORMATCHOOSEW
|
||||
PACMFORMATDETAILSA
|
||||
PACMFORMATDETAILSW
|
||||
PACMFORMATTAGDETAILSA
|
||||
PACMFORMATTAGDETAILSW
|
||||
PACMSTREAMHEADER
|
||||
PAINTSTRUCT *
|
||||
PALETTEENTRY *
|
||||
PANSI_STRING
|
||||
PAPCFUNC
|
||||
PAPI_VERSION
|
||||
PAPPBARDATA
|
||||
PAVIFILE
|
||||
PAVIFILE *
|
||||
PAVISTREAM
|
||||
PAVISTREAM *
|
||||
PBOOLEAN
|
||||
PBYTE
|
||||
PCHAR
|
||||
PCHAR *
|
||||
PCONTEXT
|
||||
PDWORD
|
||||
PENUMLOADED_MODULES_CALLBACK
|
||||
PEXCEPTION_FRAME
|
||||
PEXCEPTION_FRAME *
|
||||
PEXCEPTION_POINTERS
|
||||
PEXCEPTION_RECORD
|
||||
PFLOAT
|
||||
PFNCALLBACK
|
||||
PFNDPACOMPARE
|
||||
PFNDPAMERGE
|
||||
PFUNCTION_TABLE_ACCESS_ROUTINE
|
||||
PGENERIC_MAPPING
|
||||
PGETFRAME
|
||||
PGET_MODULE_BASE_ROUTINE
|
||||
PHACMDRIVER
|
||||
PHACMDRIVERID
|
||||
PHACMSTREAM
|
||||
PHONECALLBACK
|
||||
PIMAGEHLP_MODULE
|
||||
PIMAGEHLP_STATUS_ROUTINE
|
||||
PIMAGEHLP_SYMBOL
|
||||
PIMAGE_DEBUG_INFORMATION
|
||||
PIMAGE_LOAD_CONFIG_DIRECTORY
|
||||
PIMAGE_NT_HEADERS
|
||||
PIMAGE_SECTION_HEADER
|
||||
PIMAGE_SECTION_HEADER *
|
||||
PIO_STATUS_BLOCK
|
||||
PIXELFORMATDESCRIPTOR *
|
||||
PLARGE_INTEGER
|
||||
PLOADED_IMAGE
|
||||
PLONG
|
||||
PLUID
|
||||
PNOTIFYICONDATAA
|
||||
POBJECT_ATTRIBUTES
|
||||
POINT *
|
||||
PPRIVILEGE_SET
|
||||
PREAD_PROCESS_MEMORY_ROUTINE
|
||||
PRTL_HEAP_DEFINITION
|
||||
PROPENUMPROCA
|
||||
PROPENUMPROCEXA
|
||||
PROPENUMPROCEXW
|
||||
PROPENUMPROCW
|
||||
PSECURITY_DESCRIPTOR
|
||||
PSECURITY_DESCRIPTOR_CONTROL
|
||||
PSECURITY_QUALITY_OF_SERVICE
|
||||
PSID
|
||||
PSID *
|
||||
PSID_IDENTIFIER_AUTHORITY
|
||||
PSID_NAME_USE
|
||||
PSTACKFRAME
|
||||
PSTRING
|
||||
PSYMBOL_REGISTERED_CALLBACK
|
||||
PSYM_ENUMMODULES_CALLBACK
|
||||
PSYM_ENUMSYMBOLS_CALLBACK
|
||||
PTIMERAPCROUTINE
|
||||
PTRANSLATE_ADDRESS_ROUTINE
|
||||
PUCHAR
|
||||
PULARGE_INTEGER
|
||||
PULONG
|
||||
PUNICODE_STRING
|
||||
PVOID
|
||||
PVOID *
|
||||
PWAVEFILTER
|
||||
PWAVEFORMATEX
|
||||
PWIN_CERTIFICATE
|
||||
RECT *
|
||||
REFCLSID
|
||||
REFGUID
|
||||
REFIID
|
||||
REGISTERWORDENUMPROCA
|
||||
REGISTERWORDENUMPROCW
|
||||
RGBQUAD *
|
||||
RGNDATA *
|
||||
SAFEARRAY *
|
||||
SAFEARRAY **
|
||||
SAFEARRAYBOUND *
|
||||
SCROLLINFO *
|
||||
SECURITY_ATTRIBUTES *
|
||||
SECURITY_DESCRIPTOR *
|
||||
SECURITY_INFORMATION *
|
||||
SHFILEINFOA *
|
||||
SHFILEINFOW *
|
||||
SNB
|
||||
STGMEDIUM *
|
||||
SYSLEVEL *
|
||||
SYSLEVEL **
|
||||
SYSTEMTIME *
|
||||
TEXTMETRICA *
|
||||
TEXTMETRICW *
|
||||
TIMEFMT_ENUMPROCA
|
||||
TIMEFMT_ENUMPROCW
|
||||
TIMERPROC
|
||||
UINT *
|
||||
ULONG *
|
||||
USHORT *
|
||||
VARIANT *
|
||||
VARIANTARG *
|
||||
VARIANT_BOOL *
|
||||
VOID *
|
||||
VOID **
|
||||
WAVEHDR *
|
||||
WCHAR *
|
||||
WIN32_FIND_DATAA *
|
||||
WIN32_FIND_DATAW *
|
||||
WINDOWPLACEMENT *
|
||||
WNDCLASSA *
|
||||
WNDCLASSEXA *
|
||||
WNDCLASSEXW *
|
||||
WNDCLASSW *
|
||||
WNDENUMPROC
|
||||
WNDPROC
|
||||
WORD *
|
||||
XFORM *
|
||||
YIELDPROC
|
||||
_INITTERMFUN *
|
||||
char *
|
||||
double *
|
||||
jmp_buf
|
||||
short *
|
||||
struct _TEB *
|
||||
struct ThunkDataCommon *
|
||||
struct find_t *
|
||||
struct sockaddr *
|
||||
struct stat *
|
||||
struct timeval *
|
||||
struct win_stat *
|
||||
struct WIN_hostent *
|
||||
struct WIN_protoent *
|
||||
struct WIN_servent *
|
||||
time_t *
|
||||
va_list
|
||||
void *
|
||||
void **
|
||||
ws_fd_set32 *
|
||||
|
||||
%str
|
||||
|
||||
LPCSTR
|
||||
LPSTR
|
||||
OLECHAR *
|
||||
|
||||
%unknown
|
||||
|
||||
new_handler_type
|
||||
sig_handler_type
|
||||
struct in_addr
|
||||
|
||||
%void
|
||||
|
||||
void
|
||||
VOID
|
||||
|
||||
%wstr
|
||||
|
||||
BSTR
|
||||
LPCOLESTR
|
||||
LPCWSTR
|
||||
LPWSTR
|
||||
|
||||
%long # --forbidden
|
||||
|
||||
BOOL16
|
||||
FARPROC16
|
||||
HTASK16
|
||||
HGLOBAL16
|
||||
HINSTANCE16
|
||||
HMMIO16
|
||||
HMODULE16
|
||||
LPOLESTR16
|
||||
UINT16
|
||||
SOCKET16
|
||||
int
|
||||
long
|
||||
short
|
||||
u_long
|
||||
u_short
|
||||
unsigned
|
|
@ -0,0 +1,318 @@
|
|||
package winapi;
|
||||
|
||||
use strict;
|
||||
|
||||
sub new {
|
||||
my $proto = shift;
|
||||
my $class = ref($proto) || $proto;
|
||||
my $self = {};
|
||||
bless ($self, $class);
|
||||
|
||||
my $allowed_kind = \%{$self->{ALLOWED_KIND}};
|
||||
my $allowed_modules = \%{$self->{ALLOWED_MODULES}};
|
||||
my $allowed_modules_limited = \%{$self->{ALLOWED_MODULES_LIMITED}};
|
||||
my $translate_argument = \%{$self->{TRANSLATE_ARGUMENT}};
|
||||
|
||||
$self->{NAME} = shift;
|
||||
my $file = shift;
|
||||
|
||||
my @modules;
|
||||
my $kind;
|
||||
my $forbidden = 0;
|
||||
|
||||
open(IN, "< $file") || die "$file: $!\n";
|
||||
$/ = "\n";
|
||||
while(<IN>) {
|
||||
s/^\s*?(.*?)\s*$/$1/; # remove whitespace at begin and end of line
|
||||
s/^(.*?)\s*#.*$/$1/; # remove comments
|
||||
/^$/ && next; # skip empty lines
|
||||
|
||||
if(s/^%(\S+)\s*//) {
|
||||
$kind = $1;
|
||||
@modules = ();
|
||||
$forbidden = 0;
|
||||
|
||||
$$allowed_kind{$kind} = 1;
|
||||
if(/^--module=(\S*)/) {
|
||||
@modules = split(/,/, $1);
|
||||
} elsif(/^--forbidden/) {
|
||||
$forbidden = 1;
|
||||
}
|
||||
} elsif(defined($kind)) {
|
||||
my $type = $_;
|
||||
if(!$forbidden) {
|
||||
for my $module (@modules) {
|
||||
$$allowed_modules_limited{$type} = 1;
|
||||
$$allowed_modules{$type}{$module} = 1;
|
||||
}
|
||||
} else {
|
||||
$$allowed_modules_limited{$type} = 1;
|
||||
}
|
||||
$$translate_argument{$type} = $kind;
|
||||
} else {
|
||||
print "$file: file must begin with %<type> statement\n";
|
||||
exit 1;
|
||||
}
|
||||
}
|
||||
close(IN);
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
||||
sub get_spec_file_type {
|
||||
my $proto = shift;
|
||||
my $class = ref($proto) || $proto;
|
||||
|
||||
my $file = shift;
|
||||
|
||||
my $type;
|
||||
|
||||
open(IN, "< $file") || die "$file: $!\n";
|
||||
$/ = "\n";
|
||||
while(<IN>) {
|
||||
if(/^type\s*(\w+)/) {
|
||||
$type = $1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
close(IN);
|
||||
|
||||
return $type;
|
||||
}
|
||||
|
||||
sub read_spec_files {
|
||||
my $proto = shift;
|
||||
my $class = ref($proto) || $proto;
|
||||
|
||||
my $win16api = shift;
|
||||
my $win32api = shift;
|
||||
|
||||
foreach my $file (split(/\n/, `find . -name \\*.spec`)) {
|
||||
my $type = 'winapi'->get_spec_file_type($file);
|
||||
if($type eq "win16") {
|
||||
$win16api->parse_spec_file($file);
|
||||
} elsif($type eq "win32") {
|
||||
$win32api->parse_spec_file($file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub parse_spec_file {
|
||||
my $self = shift;
|
||||
my $function_arguments = \%{$self->{FUNCTION_ARGUMENTS}};
|
||||
my $function_calling_convention = \%{$self->{FUNCTION_CALLING_CONVENTION}};
|
||||
my $function_stub = \%{$self->{FUNCTION_STUB}};
|
||||
my $function_module = \%{$self->{FUNCTION_MODULE}};
|
||||
|
||||
my $file = shift;
|
||||
|
||||
my $type;
|
||||
my $module;
|
||||
|
||||
open(IN, "< $file") || die "$file: $!\n";
|
||||
$/ = "\n";
|
||||
my $header = 1;
|
||||
my $lookahead = 0;
|
||||
while($lookahead || defined($_ = <IN>)) {
|
||||
$lookahead = 0;
|
||||
s/^\s*(.*?)\s*$/$1/;
|
||||
s/^(.*?)\s*#.*$/$1/;
|
||||
/^$/ && next;
|
||||
|
||||
if($header) {
|
||||
if(/^name\s*(\S*)/) { $module = $1; }
|
||||
if(/^\d+/) { $header = 0 };
|
||||
next;
|
||||
}
|
||||
|
||||
if(/^\d+\s+(pascal|pascal16|stdcall|cdecl|register|interrupt|varargs)\s+(\S+)\s*\(\s*(.*?)\s*\)\s*(\S+)$/) {
|
||||
my $calling_convention = $1;
|
||||
my $external_name = $2;
|
||||
my $arguments = $3;
|
||||
my $internal_name = $4;
|
||||
|
||||
# FIXME: Internal name existing more than once not handled properly
|
||||
$$function_arguments{$internal_name} = $arguments;
|
||||
$$function_calling_convention{$internal_name} = $calling_convention;
|
||||
$$function_module{$internal_name} = $module;
|
||||
} elsif(/^\d+\s+stub\s+(\S+)$/) {
|
||||
my $external_name = $1;
|
||||
$$function_stub{$external_name} = 1;
|
||||
$$function_module{$external_name} = $module;
|
||||
} elsif(/^\d+\s+(equate|long|word|extern|forward)/) {
|
||||
# ignore
|
||||
} else {
|
||||
my $next_line = <IN>;
|
||||
if($next_line =~ /^\d/) {
|
||||
die "$file: $.: syntax error: '$_'\n";
|
||||
} else {
|
||||
$_ .= $next_line;
|
||||
$lookahead = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
close(IN);
|
||||
}
|
||||
|
||||
sub name {
|
||||
my $self = shift;
|
||||
return $self->{NAME};
|
||||
}
|
||||
|
||||
sub is_allowed_kind {
|
||||
my $self = shift;
|
||||
my $allowed_kind = \%{$self->{ALLOWED_KIND}};
|
||||
|
||||
my $kind = shift;
|
||||
if(defined($kind)) {
|
||||
return $$allowed_kind{$kind};
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
sub allowed_type_in_module {
|
||||
my $self = shift;
|
||||
my $allowed_modules = \%{$self->{ALLOWED_MODULES}};
|
||||
my $allowed_modules_limited = \%{$self->{ALLOWED_MODULES_LIMITED}};
|
||||
|
||||
my $type = shift;
|
||||
my $module = shift;
|
||||
|
||||
return !$$allowed_modules_limited{$type} || $$allowed_modules{$type}{$module};
|
||||
}
|
||||
|
||||
sub translate_argument {
|
||||
my $self = shift;
|
||||
my $translate_argument = \%{$self->{TRANSLATE_ARGUMENT}};
|
||||
|
||||
my $argument = shift;
|
||||
|
||||
return $$translate_argument{$argument};
|
||||
}
|
||||
|
||||
sub all_declared_types {
|
||||
my $self = shift;
|
||||
my $translate_argument = \%{$self->{TRANSLATE_ARGUMENT}};
|
||||
|
||||
return sort(keys(%$translate_argument));
|
||||
}
|
||||
|
||||
sub found_type {
|
||||
my $self = shift;
|
||||
my $type_found = \%{$self->{TYPE_FOUND}};
|
||||
|
||||
my $name = shift;
|
||||
|
||||
$$type_found{$name}++;
|
||||
}
|
||||
|
||||
sub type_found {
|
||||
my $self = shift;
|
||||
my $type_found= \%{$self->{TYPE_FOUND}};
|
||||
|
||||
my $name = shift;
|
||||
|
||||
return $$type_found{$name};
|
||||
}
|
||||
|
||||
sub all_functions {
|
||||
my $self = shift;
|
||||
my $function_calling_convention = \%{$self->{FUNCTION_CALLING_CONVENTION}};
|
||||
|
||||
return sort(keys(%$function_calling_convention));
|
||||
}
|
||||
|
||||
sub all_functions_found {
|
||||
my $self = shift;
|
||||
my $function_found = \$self->{FUNCTION_FOUND};
|
||||
|
||||
return sort(keys(%$function_found));
|
||||
}
|
||||
|
||||
sub function_calling_convention {
|
||||
my $self = shift;
|
||||
my $function_calling_convention = \%{$self->{FUNCTION_CALLING_CONVENTION}};
|
||||
|
||||
my $name = shift;
|
||||
|
||||
return $$function_calling_convention{$name};
|
||||
}
|
||||
|
||||
sub is_function {
|
||||
my $self = shift;
|
||||
my $function_calling_convention = \%{$self->{FUNCTION_CALLING_CONVENTION}};
|
||||
|
||||
my $name = shift;
|
||||
|
||||
return $$function_calling_convention{$name};
|
||||
}
|
||||
|
||||
sub is_shared_function {
|
||||
my $self = shift;
|
||||
my $function_shared = \%{$self->{FUNCTION_SHARED}};
|
||||
|
||||
my $name = shift;
|
||||
|
||||
return $$function_shared{$name};
|
||||
}
|
||||
|
||||
sub found_shared_function {
|
||||
my $self = shift;
|
||||
my $function_shared = \%{$self->{FUNCTION_SHARED}};
|
||||
|
||||
my $name = shift;
|
||||
|
||||
$$function_shared{$name} = 1;
|
||||
}
|
||||
|
||||
sub function_arguments {
|
||||
my $self = shift;
|
||||
my $function_arguments = \%{$self->{FUNCTION_ARGUMENTS}};
|
||||
|
||||
my $name = shift;
|
||||
|
||||
return $$function_arguments{$name};
|
||||
}
|
||||
|
||||
sub function_module {
|
||||
my $self = shift;
|
||||
my $function_module = \%{$self->{FUNCTION_MODULE}};
|
||||
|
||||
my $name = shift;
|
||||
|
||||
if($self->is_function($name)) {
|
||||
return $$function_module{$name};
|
||||
} else {
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
|
||||
sub function_stub {
|
||||
my $self = shift;
|
||||
my $function_stub = \%{$self->{FUNCTION_STUB}};
|
||||
|
||||
my $name = shift;
|
||||
|
||||
return $$function_stub{$name};
|
||||
}
|
||||
|
||||
sub found_function {
|
||||
my $self = shift;
|
||||
my $function_found = \%{$self->{FUNCTION_FOUND}};
|
||||
|
||||
my $name = shift;
|
||||
|
||||
$$function_found{$name}++;
|
||||
}
|
||||
|
||||
sub function_found {
|
||||
my $self = shift;
|
||||
my $function_found = \%{$self->{FUNCTION_FOUND}};
|
||||
|
||||
my $name = shift;
|
||||
|
||||
return $$function_found{$name};
|
||||
}
|
||||
|
||||
1;
|
|
@ -0,0 +1,118 @@
|
|||
#!/usr/bin/perl -w
|
||||
|
||||
# Copyright 1999 Patrik Stridvall
|
||||
|
||||
use strict;
|
||||
|
||||
BEGIN {
|
||||
require "tools/winapi_check/winapi.pm";
|
||||
require "tools/winapi_check/nativeapi.pm";
|
||||
require "tools/winapi_check/winapi_local.pm";
|
||||
require "tools/winapi_check/winapi_global.pm";
|
||||
require "tools/winapi_check/winapi_options.pm";
|
||||
require "tools/winapi_check/winapi_parser.pm";
|
||||
|
||||
import winapi;
|
||||
import nativeapi;
|
||||
import winapi_local;
|
||||
import winapi_global;
|
||||
import winapi_options;
|
||||
import winapi_parser;
|
||||
}
|
||||
|
||||
my $options = winapi_options->new(\@ARGV);
|
||||
if($options->help) {
|
||||
$options->show_help;
|
||||
exit;
|
||||
}
|
||||
|
||||
my $win16api = 'winapi'->new("win16", "tools/winapi_check/win16api.dat");
|
||||
my $win32api = 'winapi'->new("win32", "tools/winapi_check/win32api.dat");
|
||||
'winapi'->read_spec_files($win16api, $win32api);
|
||||
|
||||
my $nativeapi = 'nativeapi'->new("tools/winapi_check/nativeapi.dat");
|
||||
|
||||
for my $name ($win32api->all_functions) {
|
||||
my $module16 = $win16api->function_module($name);
|
||||
my $module32 = $win32api->function_module($name);
|
||||
|
||||
if(defined($module16)) {
|
||||
$win16api->found_shared_function($name);
|
||||
$win32api->found_shared_function($name);
|
||||
|
||||
if($options->shared) {
|
||||
print "*.spec: $name: is shared between $module16 (Win16) and $module32 (Win32)\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach my $file ($options->files) {
|
||||
my $found_function = sub {
|
||||
my $return_type = shift;
|
||||
my $calling_convention = shift;
|
||||
my $name = shift;
|
||||
my $refarguments = shift;
|
||||
my @arguments = @$refarguments;
|
||||
|
||||
if($options->global) {
|
||||
$win16api->found_type($return_type) if $options->win16;
|
||||
$win32api->found_type($return_type) if $options->win32;
|
||||
for my $argument (@arguments) {
|
||||
$win16api->found_type($argument) if $options->win16;
|
||||
$win32api->found_type($argument) if $options->win32;
|
||||
}
|
||||
|
||||
$win16api->found_function($name) if $options->win16;
|
||||
$win32api->found_function($name) if $options->win32;
|
||||
}
|
||||
|
||||
if($options->local) {
|
||||
my $module16 = $win16api->function_module($name);
|
||||
my $module32 = $win32api->function_module($name);
|
||||
my $output = sub {
|
||||
my $module = shift;
|
||||
return sub {
|
||||
my $msg = shift;
|
||||
print "$file: $module: $return_type $calling_convention $name(" . join(",", @arguments) . "): $msg\n";
|
||||
}
|
||||
};
|
||||
my $output16 = &$output($module16);
|
||||
my $output32 = &$output($module32);
|
||||
|
||||
if($options->argument) {
|
||||
if($options->win16 && $options->report_module($module16)) {
|
||||
winapi_local::check_arguments $options, $output16,
|
||||
$return_type, $calling_convention, $name, [@arguments], $win16api;
|
||||
}
|
||||
if($options->win32 && $options->report_module($module32)) {
|
||||
winapi_local::check_arguments $options, $output32,
|
||||
$return_type, $calling_convention, $name, [@arguments], $win32api;
|
||||
}
|
||||
}
|
||||
if($options->misplaced) {
|
||||
my $module;
|
||||
if($file =~ m'^dlls/(.*)/') {
|
||||
$module = $1;
|
||||
}
|
||||
|
||||
if($options->win16 && $options->report_module($module16)) {
|
||||
if(!defined($module) || $module ne $module16) {
|
||||
&$output16("function misplaced");
|
||||
}
|
||||
}
|
||||
|
||||
if($options->win32 && $options->report_module($module32)) {
|
||||
if(!defined($module) || $module ne $module32) {
|
||||
&$output32("function misplaced");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
winapi_parser::parse_c_file $options, $file, $found_function;
|
||||
}
|
||||
|
||||
if($options->global) {
|
||||
winapi_global::check $options, $win16api, $nativeapi if $options->win16;
|
||||
winapi_global::check $options, $win32api, $nativeapi if $options->win32;
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
package winapi_global;
|
||||
|
||||
use strict;
|
||||
|
||||
sub check {
|
||||
my $options = shift;
|
||||
my $winapi = shift;
|
||||
my $nativeapi = shift;
|
||||
|
||||
my $winver = $winapi->name;
|
||||
|
||||
if($options->argument) {
|
||||
foreach my $type ($winapi->all_declared_types) {
|
||||
if(!$winapi->type_found($type) && $type ne "CONTEXT86 *") {
|
||||
print "*.c: $winver: $type: ";
|
||||
print "type not used\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($options->declared) {
|
||||
foreach my $name ($winapi->all_functions) {
|
||||
if(!$winapi->function_found($name) && !$nativeapi->is_function($name)) {
|
||||
print "*.c: $winver: $name: ";
|
||||
print "function declared but not implemented: " . $winapi->function_arguments($name) . "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($options->implemented) {
|
||||
foreach my $name ($winapi->all_functions_found) {
|
||||
if($winapi->function_stub($name)) {
|
||||
print "*.c: $winver: $name: ";
|
||||
print "function implemented but not declared\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
@ -0,0 +1,136 @@
|
|||
package winapi_local;
|
||||
|
||||
use strict;
|
||||
|
||||
sub check_arguments {
|
||||
my $options = shift;
|
||||
my $output = shift;
|
||||
my $return_type = shift;
|
||||
my $calling_convention = shift;
|
||||
my $name = shift;
|
||||
my $refargument_types = shift;
|
||||
my @argument_types = @$refargument_types;
|
||||
my $winapi = shift;
|
||||
|
||||
my $module = $winapi->function_module($name);
|
||||
|
||||
my $forbidden_return_type = 0;
|
||||
my $implemented_return_kind;
|
||||
if(!defined($implemented_return_kind = $winapi->translate_argument($return_type))) {
|
||||
if($return_type ne "") {
|
||||
&$output("no translation defined: " . $return_type);
|
||||
}
|
||||
} elsif(!$winapi->is_allowed_kind($implemented_return_kind) || !$winapi->allowed_type_in_module($return_type,$module)) {
|
||||
$forbidden_return_type = 1;
|
||||
if($options->report_argument_forbidden($return_type)) {
|
||||
&$output("forbidden return type: $return_type ($implemented_return_kind)");
|
||||
}
|
||||
}
|
||||
|
||||
my $segmented = 0;
|
||||
if($implemented_return_kind =~ /^segptr|segstr$/) {
|
||||
$segmented = 1;
|
||||
}
|
||||
|
||||
my $implemented_calling_convention;
|
||||
if($winapi->name eq "win16") {
|
||||
if($calling_convention =~ /^__cdecl$/) {
|
||||
$implemented_calling_convention = "cdecl";
|
||||
} elsif($calling_convention = ~ /^__stdcall|VFWAPI|WINAPI$/) {
|
||||
if($implemented_return_kind =~ /^s_word|word|void$/) {
|
||||
$implemented_calling_convention = "pascal16";
|
||||
} else {
|
||||
$implemented_calling_convention = "pascal";
|
||||
}
|
||||
}
|
||||
} elsif($winapi->name eq "win32") {
|
||||
if($calling_convention =~ /^__cdecl$/) {
|
||||
$implemented_calling_convention = "cdecl";
|
||||
} elsif($calling_convention =~ /^VFWAPIV|WINAPIV$/) {
|
||||
$implemented_calling_convention = "varargs";
|
||||
} elsif($calling_convention = ~ /^__stdcall|VFWAPI|WINAPI$/) {
|
||||
$implemented_calling_convention = "stdcall";
|
||||
}
|
||||
}
|
||||
|
||||
my $declared_calling_convention = $winapi->function_calling_convention($name);
|
||||
my @declared_argument_kinds = split(/\s+/, $winapi->function_arguments($name));
|
||||
|
||||
if($declared_calling_convention =~ /^register|interrupt$/) {
|
||||
push @declared_argument_kinds, "ptr";
|
||||
}
|
||||
|
||||
if($declared_calling_convention =~ /^register|interupt$/ &&
|
||||
(($winapi->name eq "win32" && $implemented_calling_convention eq "stdcall") ||
|
||||
(($winapi->name eq "win16" && $implemented_calling_convention =~ /^pascal/))))
|
||||
{
|
||||
# correct
|
||||
} elsif($implemented_calling_convention ne $declared_calling_convention &&
|
||||
!($declared_calling_convention =~ /^pascal/ && $forbidden_return_type))
|
||||
{
|
||||
if($options->calling_convention) {
|
||||
&$output("calling convention mismatch: $implemented_calling_convention != $declared_calling_convention");
|
||||
}
|
||||
}
|
||||
|
||||
if($declared_calling_convention eq "varargs") {
|
||||
if($#argument_types != -1 && $argument_types[$#argument_types] eq "...") {
|
||||
pop @argument_types;
|
||||
} else {
|
||||
&$output("function not implemented as vararg");
|
||||
}
|
||||
} elsif($#argument_types != -1 && $argument_types[$#argument_types] eq "...") {
|
||||
&$output("function not declared as vararg");
|
||||
}
|
||||
|
||||
if($name =~ /^CRTDLL__ftol|CRTDLL__CIpow$/) {
|
||||
# ignore
|
||||
} elsif($#argument_types != $#declared_argument_kinds) {
|
||||
if($options->argument_count) {
|
||||
&$output("argument count differs: " . ($#argument_types + 1) . " != " . ($#declared_argument_kinds + 1));
|
||||
}
|
||||
} else {
|
||||
my $n = 0;
|
||||
my @argument_kinds = map {
|
||||
my $type = $_;
|
||||
my $kind = "unknown";
|
||||
if(!defined($kind = $winapi->translate_argument($type))) {
|
||||
&$output("no translation defined: " . $type);
|
||||
} elsif(!$winapi->is_allowed_kind($kind) ||
|
||||
!$winapi->allowed_type_in_module($type, $module)) {
|
||||
if($options->report_argument_forbidden($type)) {
|
||||
&$output("forbidden argument " . ($n + 1) . " type (" . $type . ")");
|
||||
}
|
||||
}
|
||||
$n++;
|
||||
$kind;
|
||||
} @argument_types;
|
||||
|
||||
for my $n (0..$#argument_kinds) {
|
||||
if(!defined($argument_kinds[$n]) || !defined($declared_argument_kinds[$n])) { next; }
|
||||
|
||||
if($argument_kinds[$n] =~ /^segptr|segstr$/ ||
|
||||
$declared_argument_kinds[$n] =~ /^segptr|segstr$/)
|
||||
{
|
||||
$segmented = 1;
|
||||
}
|
||||
|
||||
if($argument_kinds[$n] ne $declared_argument_kinds[$n]) {
|
||||
if($options->report_argument_kind($argument_kinds[$n]) ||
|
||||
$options->report_argument_kind($declared_argument_kinds[$n]))
|
||||
{
|
||||
&$output("argument " . ($n + 1) . " type mismatch: " .
|
||||
$argument_types[$n] . " ($argument_kinds[$n]) != " . $declared_argument_kinds[$n]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if($segmented && $options->shared_segmented && $winapi->is_shared_function($name)) {
|
||||
&$output("function using segmented pointers shared between Win16 och Win32");
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
@ -0,0 +1,272 @@
|
|||
package winapi_options;
|
||||
|
||||
use strict;
|
||||
|
||||
|
||||
sub parser_comma_list {
|
||||
my $prefix = shift;
|
||||
my $value = shift;
|
||||
if(defined($prefix) && $prefix eq "no") {
|
||||
return { active => 0, filter => 0, hash => {} };
|
||||
} elsif(defined($value)) {
|
||||
my %names;
|
||||
for my $name (split /,/, $value) {
|
||||
$names{$name} = 1;
|
||||
}
|
||||
return { active => 1, filter => 1, hash => \%names };
|
||||
} else {
|
||||
return { active => 1, filter => 0, hash => {} };
|
||||
}
|
||||
}
|
||||
|
||||
my %options = (
|
||||
"debug" => { default => 0, description => "debug mode" },
|
||||
"help" => { default => 0, description => "help mode" },
|
||||
"verbose" => { default => 0, description => "verbose mode" },
|
||||
|
||||
"win16" => { default => 1, description => "Win16 checking" },
|
||||
"win32" => { default => 1, description => "Win32 checking" },
|
||||
|
||||
"shared" => { default => 0, description => "show shared functions between Win16 and Win32" },
|
||||
"shared-segmented" => { default => 0, description => "segmented shared functions between Win16 and Win32 checking" },
|
||||
|
||||
"local" => { default => 1, description => "local checking" },
|
||||
"module" => {
|
||||
default => { active => 1, filter => 0, hash => {} },
|
||||
parent => "local",
|
||||
parser => \&parser_comma_list,
|
||||
description => "module filter"
|
||||
},
|
||||
|
||||
"argument" => { default => 1, parent => "local", description => "argument checking" },
|
||||
"argument-count" => { default => 1, parent => "argument", description => "argument count checking" },
|
||||
"argument-forbidden" => {
|
||||
default => { active => 0, filter => 0, hash => {} },
|
||||
parent => "argument",
|
||||
parser => \&parser_comma_list,
|
||||
description => "argument forbidden checking"
|
||||
},
|
||||
"argument-kind" => {
|
||||
default => { active => 0, filter => 0, hash => {} },
|
||||
parent => "argument",
|
||||
parser => \&parser_comma_list,
|
||||
description => "argument kind checking"
|
||||
},
|
||||
"calling-convention" => { default => 0, parent => "local", description => "calling convention checking" },
|
||||
"misplaced" => { default => 0, parent => "local", description => "checking for misplaced functions" },
|
||||
|
||||
"global" => { default => 1, description => "global checking" },
|
||||
"declared" => { default => 1, parent => "global", description => "declared checking" },
|
||||
"implemented" => { default => 0, parent => "global", description => "implemented checking" }
|
||||
|
||||
);
|
||||
|
||||
my %short_options = (
|
||||
"d" => "debug",
|
||||
"?" => "help",
|
||||
"v" => "verbose"
|
||||
);
|
||||
|
||||
sub new {
|
||||
my $proto = shift;
|
||||
my $class = ref($proto) || $proto;
|
||||
my $self = {};
|
||||
bless ($self, $class);
|
||||
|
||||
my $refarguments = shift;
|
||||
my @ARGV = @$refarguments;
|
||||
|
||||
for my $name (sort(keys(%options))) {
|
||||
my $option = $options{$name};
|
||||
my $key = uc($name);
|
||||
$key =~ tr/-/_/;
|
||||
$$option{key} = $key;
|
||||
my $refvalue = \${$self->{$key}};
|
||||
$$refvalue = $$option{default};
|
||||
}
|
||||
|
||||
my $files = \@{$self->{FILES}};
|
||||
my $module = \${$self->{MODULE}};
|
||||
my $global = \${$self->{GLOBAL}};
|
||||
|
||||
while(defined($_ = shift @ARGV)) {
|
||||
if(/^-([^=]*)(=(.*))?$/) {
|
||||
my $name;
|
||||
my $value;
|
||||
if(defined($2)) {
|
||||
$name = $1;
|
||||
$value = $3;
|
||||
} else {
|
||||
$name = $1;
|
||||
}
|
||||
|
||||
if($name =~ /^([^-].*)$/) {
|
||||
$name = $short_options{$1};
|
||||
} else {
|
||||
$name =~ s/^-(.*)$/$1/;
|
||||
}
|
||||
|
||||
my $prefix;
|
||||
if($name =~ /^no-(.*)$/) {
|
||||
$name = $1;
|
||||
$prefix = "no";
|
||||
if(defined($value)) {
|
||||
print STDERR "<internal>: options with prefix 'no' can't take parameters\n";
|
||||
exit 1;
|
||||
}
|
||||
}
|
||||
|
||||
my $option = $options{$name};
|
||||
if(defined($option)) {
|
||||
my $key = $$option{key};
|
||||
my $parser = $$option{parser};
|
||||
my $refvalue = \${$self->{$key}};
|
||||
|
||||
if(defined($parser)) {
|
||||
$$refvalue = &$parser($prefix,$value);
|
||||
} else {
|
||||
if(defined($value)) {
|
||||
$$refvalue = $value;
|
||||
} elsif(!defined($prefix)) {
|
||||
$$refvalue = 1;
|
||||
} else {
|
||||
$$refvalue = 0;
|
||||
}
|
||||
}
|
||||
next;
|
||||
}
|
||||
}
|
||||
|
||||
if(/^--module-dlls$/) {
|
||||
my @dirs = `cd dlls && find ./ -type d ! -name CVS`;
|
||||
my %names;
|
||||
for my $dir (@dirs) {
|
||||
chomp $dir;
|
||||
$dir =~ s/^\.\/(.*)$/$1/;
|
||||
next if $dir eq "";
|
||||
$names{$dir} = 1;
|
||||
}
|
||||
$$module = { active => 1, filter => 1, hash => \%names };
|
||||
}
|
||||
elsif(/^-(.*)$/) {
|
||||
print STDERR "<internal>: unknown option: $&\n";
|
||||
print STDERR "<internal>: usage: winapi-check [--help] [<files>]\n";
|
||||
exit 1;
|
||||
} else {
|
||||
push @$files, $_;
|
||||
}
|
||||
}
|
||||
|
||||
if($#$files == -1) {
|
||||
@$files = map {
|
||||
s/^.\/(.*)$/$1/;
|
||||
$_;
|
||||
} split(/\n/, `find . -name \\*.c`);
|
||||
} else {
|
||||
$$global = 0
|
||||
}
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
||||
sub show_help {
|
||||
my $self = shift;
|
||||
|
||||
my $maxname = 0;
|
||||
for my $name (sort(keys(%options))) {
|
||||
if(length($name) > $maxname) {
|
||||
$maxname = length($name);
|
||||
}
|
||||
}
|
||||
|
||||
print "usage: winapi-check [--help] [<files>]\n";
|
||||
print "\n";
|
||||
for my $name (sort(keys(%options))) {
|
||||
my $option = $options{$name};
|
||||
my $description = $$option{description};
|
||||
my $default = $$option{default};
|
||||
|
||||
my $output;
|
||||
if(ref($default) ne "HASH") {
|
||||
if($default) {
|
||||
$output = "--no-$name";
|
||||
} else {
|
||||
$output = "--$name";
|
||||
}
|
||||
} else {
|
||||
if($default->{active}) {
|
||||
$output = "--[no-]$name\[=<value>]";
|
||||
} else {
|
||||
$output = "--$name\[=<value>]";
|
||||
}
|
||||
}
|
||||
|
||||
print "$output";
|
||||
for (0..(($maxname - length($name) + 14) - (length($output) - length($name) + 1))) { print " "; }
|
||||
if(ref($default) ne "HASH") {
|
||||
if($default) {
|
||||
print "Disable $description\n";
|
||||
} else {
|
||||
print "Enable $description\n";
|
||||
}
|
||||
} else {
|
||||
if($default->{active}) {
|
||||
print "(Disable) $description\n";
|
||||
} else {
|
||||
print "Enable $description\n";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub AUTOLOAD {
|
||||
my $self = shift;
|
||||
|
||||
my $name = $winapi_options::AUTOLOAD;
|
||||
$name =~ s/^.*::(.[^:]*)$/\U$1/;
|
||||
|
||||
my $refvalue = $self->{$name};
|
||||
if(!defined($refvalue)) {
|
||||
die "<internal>: winapi_options.pm: member $name does not exists\n";
|
||||
}
|
||||
return $$refvalue;
|
||||
}
|
||||
|
||||
sub files { my $self = shift; return @{$self->{FILES}}; }
|
||||
|
||||
sub report_module {
|
||||
my $self = shift;
|
||||
my $module = $self->module;
|
||||
|
||||
my $name = shift;
|
||||
|
||||
if(defined($name)) {
|
||||
return $module->{active} && (!$module->{filter} || $module->{hash}->{$name});
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
sub report_argument_forbidden {
|
||||
my $self = shift;
|
||||
my $argument_forbidden = $self->argument_forbidden;
|
||||
|
||||
my $type = shift;
|
||||
|
||||
return $argument_forbidden->{active} && (!$argument_forbidden->{filter} || $argument_forbidden->{hash}->{$type});
|
||||
}
|
||||
|
||||
sub report_argument_kind {
|
||||
my $self = shift;
|
||||
my $argument_kind = $self->argument_kind;
|
||||
|
||||
my $kind = shift;
|
||||
|
||||
return $argument_kind->{active} && (!$argument_kind->{filter} || $argument_kind->{hash}->{$kind});
|
||||
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
@ -0,0 +1,161 @@
|
|||
package winapi_parser;
|
||||
|
||||
use strict;
|
||||
|
||||
sub parse_c_file {
|
||||
my $options = shift;
|
||||
my $file = shift;
|
||||
my $function_found_callback = shift;
|
||||
|
||||
my $level = 0;
|
||||
my $again = 0;
|
||||
my $lookahead = 0;
|
||||
my $lookahead_count = 0;
|
||||
|
||||
print STDERR "Processing file '$file' ... " if $options->verbose;
|
||||
open(IN, "< $file") || die "<internal>: $file: $!\n";
|
||||
$/ = "\n";
|
||||
while($again || defined(my $line = <IN>)) {
|
||||
if(!$again) {
|
||||
chomp $line;
|
||||
|
||||
if($lookahead) {
|
||||
$lookahead = 0;
|
||||
$_ .= "\n" . $line;
|
||||
} else {
|
||||
$_ = $line;
|
||||
$lookahead_count = 0;
|
||||
}
|
||||
$lookahead_count++;
|
||||
print "$level: $line\n" if $options->debug >= 2;
|
||||
} else {
|
||||
$lookahead_count = 0;
|
||||
$again = 0;
|
||||
}
|
||||
|
||||
# remove comments
|
||||
if(s/^(.*?)\/\*.*?\*\/(.*)$/$1 $2/s) { $again = 1; next };
|
||||
if(/^(.*?)\/\*/s) {
|
||||
$lookahead = 1;
|
||||
next;
|
||||
}
|
||||
|
||||
# remove empty rows
|
||||
if(/^\s*$/) { next; }
|
||||
|
||||
# remove preprocessor directives
|
||||
if(s/^\s*\#.*$//m) { $again = 1; next; }
|
||||
|
||||
if($level > 0)
|
||||
{
|
||||
s/^[^\{\}]*//s;
|
||||
if(/^\{/) {
|
||||
$_ = $'; $again = 1;
|
||||
print "+1: $_\n" if $options->debug >= 2;
|
||||
$level++;
|
||||
} elsif(/^\}/) {
|
||||
$_ = $'; $again = 1;
|
||||
print "-1: $_\n" if $options->debug >= 2;
|
||||
$level--;
|
||||
}
|
||||
next;
|
||||
} elsif(/((struct\s+|union\s+|enum\s+)?\w+((\s*\*)+\s*|\s+))(__cdecl|__stdcall|VFWAPIV|VFWAPI|WINAPIV|WINAPI)\s+(\w+(\(\w+\))?)\s*\(([^\)]*)\)\s*(\{|\;)/s) {
|
||||
$_ = $'; $again = 1;
|
||||
|
||||
if($9 eq ";") {
|
||||
next;
|
||||
} elsif($9 eq "{") {
|
||||
$level++;
|
||||
}
|
||||
|
||||
my $return_type = $1;
|
||||
my $calling_convention = $5;
|
||||
my $name = $6;
|
||||
my $arguments = $8;
|
||||
|
||||
$return_type =~ s/\s*$//;
|
||||
$return_type =~ s/\s*\*\s*/*/g;
|
||||
$return_type =~ s/(\*+)/ $1/g;
|
||||
|
||||
$name =~ s/^REGS_FUNC\((.*?)\)/$1/;
|
||||
|
||||
$arguments =~ y/\t\n/ /;
|
||||
$arguments =~ s/^\s*(.*?)\s*$/$1/;
|
||||
if($arguments eq "") { $arguments = "void" }
|
||||
|
||||
my @arguments = split(/,/, $arguments);
|
||||
foreach my $n (0..$#arguments) {
|
||||
my $argument = $arguments[$n];
|
||||
$argument =~ s/^\s*(.*?)\s*$/$1/;
|
||||
#print " " . ($n + 1) . ": '$argument'\n";
|
||||
$argument =~ s/^(const(?=\s)|IN(?=\s)|OUT(?=\s)|(\s*))\s*//;
|
||||
if($argument =~ /^...$/) {
|
||||
$argument = "...";
|
||||
} elsif($argument =~ /^((struct\s+|union\s+|enum\s+)?\w+)\s*((\*\s*?)*)\s*/) {
|
||||
$argument = "$1";
|
||||
if($3 ne "") {
|
||||
$argument .= " $3";
|
||||
}
|
||||
} else {
|
||||
die "$file: $.: syntax error: '$argument'\n";
|
||||
}
|
||||
$arguments[$n] = $argument;
|
||||
#print " " . ($n + 1) . ": '" . $arguments[$n] . "'\n";
|
||||
}
|
||||
if($#arguments == 0 && $arguments[0] =~ /^void$/i) { $#arguments = -1; }
|
||||
|
||||
if($options->debug) {
|
||||
print "$file: $return_type $calling_convention $name(" . join(",", @arguments) . ")\n";
|
||||
}
|
||||
&$function_found_callback($return_type,$calling_convention,$name,\@arguments);
|
||||
|
||||
} elsif(/DC_(GET_X_Y|GET_VAL_16)\s*\(\s*(.*?)\s*,\s*(.*?)\s*,\s*(.*?)\s*\)/s) {
|
||||
$_ = $'; $again = 1;
|
||||
my @arguments = ("HDC16");
|
||||
&$function_found_callback($2, "WINAPI", $3, \@arguments);
|
||||
} elsif(/DC_(GET_VAL_32)\s*\(\s*(.*?)\s*,\s*(.*?)\s*,.*?\)/s) {
|
||||
$_ = $'; $again = 1;
|
||||
my @arguments = ("HDC");
|
||||
&$function_found_callback($2, "WINAPI", $3, \@arguments);
|
||||
} elsif(/DC_(GET_VAL_EX)\s*\(\s*(.*?)\s*,\s*(.*?)\s*,\s*(.*?)\s*,\s*(.*?)\s*\)/s) {
|
||||
$_ = $'; $again = 1;
|
||||
my @arguments16 = ("HDC16", "LP" . $5 . "16");
|
||||
my @arguments32 = ("HDC", "LP" . $5);
|
||||
&$function_found_callback("BOOL16", "WINAPI", $2 . "16", \@arguments16);
|
||||
&$function_found_callback("BOOL", "WINAPI", $2, \@arguments32);
|
||||
} elsif(/DC_(SET_MODE)\s*\(\s*(.*?)\s*,\s*(.*?)\s*,\s*(.*?)\s*,\s*(.*?)\s*\)/s) {
|
||||
$_ = $'; $again = 1;
|
||||
my @arguments16 = ("HDC16", "INT16");
|
||||
my @arguments32 = ("HDC", "INT");
|
||||
&$function_found_callback("INT16", "WINAPI", $2 . "16", \@arguments16);
|
||||
&$function_found_callback("INT", "WINAPI", $2, \@arguments32);
|
||||
} elsif(/WAVEOUT_SHORTCUT_(1|2)\s*\(\s*(.*?)\s*,\s*(.*?)\s*,\s*(.*?)\s*\)/s) {
|
||||
$_ = $'; $again = 1;
|
||||
print "$_";
|
||||
if($1 eq "1") {
|
||||
my @arguments16 = ("HWAVEOUT16", $4);
|
||||
my @arguments32 = ("HWAVEOUT", $4);
|
||||
&$function_found_callback("UINT16", "WINAPI", "waveOut" . $2 . "16", \@arguments16);
|
||||
&$function_found_callback("UINT", "WINAPI", "waveOut" . $2, \@arguments32);
|
||||
} elsif($1 eq 2) {
|
||||
my @arguments16 = ("UINT16", $4);
|
||||
my @arguments32 = ("UINT", $4);
|
||||
&$function_found_callback("UINT16", "WINAPI", "waveOut". $2 . "16", \@arguments16);
|
||||
&$function_found_callback("UINT", "WINAPI", "waveOut" . $2, \@arguments32)
|
||||
}
|
||||
} elsif(/;/s) {
|
||||
$_ = $'; $again = 1;
|
||||
} elsif(/\{/s) {
|
||||
$_ = $'; $again = 1;
|
||||
print "+1: $_\n" if $options->debug >= 2;
|
||||
$level++;
|
||||
} else {
|
||||
$lookahead = 1;
|
||||
}
|
||||
}
|
||||
close(IN);
|
||||
print STDERR "done\n" if $options->verbose;
|
||||
print "$file: <>: not at toplevel at end of file\n" unless $level == 0;
|
||||
}
|
||||
|
||||
1;
|
Loading…
Reference in New Issue