# WIN32K.SYS
WIN32K_SVC_DB = $(NCI_BASE_)w32ksvc.db
WIN32K_SERVICE_TABLE = subsystems$(SEP)win32$(SEP)win32k$(SEP)include$(SEP)napi.h
-WIN32K_GDI_STUBS = dll$(SEP)win32$(SEP)gdi32$(SEP)misc$(SEP)win32k.S
-WIN32K_USER_STUBS = dll$(SEP)win32$(SEP)user32$(SEP)misc$(SEP)win32k.S
+WIN32K_GDI_STUBS = dll$(SEP)win32$(SEP)gdi32$(SEP)misc$(SEP)$(ARCH)$(SEP)win32k.S
+WIN32K_USER_STUBS = dll$(SEP)win32$(SEP)user32$(SEP)misc$(SEP)$(ARCH)$(SEP)win32k.S
# NTOSKRNL.EXE
KERNEL_SVC_DB = $(NCI_BASE_)sysfuncs.lst
KERNEL_SERVICE_TABLE = ntoskrnl$(SEP)include$(SEP)internal$(SEP)napi.h
-NTDLL_STUBS = dll$(SEP)ntdll$(SEP)napi.S
-KERNEL_STUBS = ntoskrnl$(SEP)ex$(SEP)zw.S
+NTDLL_STUBS = dll$(SEP)ntdll$(SEP)$(ARCH)$(SEP)napi.S
+KERNEL_STUBS = ntoskrnl$(SEP)ex$(SEP)$(ARCH)$(SEP)zw.S
NCI_SERVICE_FILES = \
$(KERNEL_SERVICE_TABLE) \
$(NCI_SERVICE_FILES): $(NCI_TARGET) $(KERNEL_SVC_DB) $(WIN32K_SVC_DB)
$(ECHO_NCI)
- $(Q)$(NCI_TARGET) \
+ ${mkdir} dll$(SEP)ntdll$(SEP)$(ARCH) 2>$(NUL)
+ ${mkdir} ntoskrnl$(SEP)ex$(SEP)$(ARCH) 2>$(NUL)
+ ${mkdir} dll$(SEP)win32$(SEP)gdi32$(SEP)misc$(SEP)$(ARCH) 2>$(NUL)
+ ${mkdir} dll$(SEP)win32$(SEP)user32$(SEP)misc$(SEP)$(ARCH) 2>$(NUL)
+ $(Q)$(NCI_TARGET) -arch $(ARCH) \
$(KERNEL_SVC_DB) \
$(WIN32K_SVC_DB) \
$(KERNEL_SERVICE_TABLE) \
" movl $KUSER_SHARED_SYSCALL, %%ecx\n" \
" call *(%%ecx)\n" \
" ret $0x%x\n\n"
+
+#define UserModeStub_ppc " mflr 0\n" \
+ " addi 1,1,-16\n" \
+ " li 0,%x\n" \
+ " stw 0,1(0)\n" \
+ " sc\n" \
+ " lwz 0,1(0)\n" \
+ " mtlr 0\n" \
+ " addi 1,1,16\n" \
+ " blr\n"
#elif defined(_MSC_VER)
#define UserModeStub_x86 " asm { \n" \
" mov eax, %xh\n" \
" pushl $KGDT_R0_CODE\n" \
" call _KiSystemService\n" \
" ret $0x%x\n\n"
+
+#define KernelModeStub_ppc " bl KiSystemService\n" \
+ " rfi\n"
#elif defined(_MSC_VER)
#define KernelModeStub_x86 " asm { \n" \
" mov eax, %xh\n" \
#endif
/***** Arch Dependent Stuff ******/
-//#ifdef _M_IX86
-#define ARGS_TO_BYTES(x) x*4
-#define UserModeStub UserModeStub_x86
-#define KernelModeStub KernelModeStub_x86
-
-//#elseif
-//#error Unsupported Architecture
-//#endif
+struct ncitool_data_t {
+ const char *arch;
+ int args_to_bytes;
+ const char *km_stub;
+ const char *um_stub;
+ const char *global_header;
+ const char *declaration;
+};
+
+struct ncitool_data_t ncitool_data[] = {
+ { "i386", 4, KernelModeStub_x86, UserModeStub_x86,
+ ".global _%s@%d\n", "_%s@%d:\n" },
+ { "powerpc", 4, KernelModeStub_ppc, UserModeStub_ppc,
+ "\t.globl %s\n", "%s:\n" },
+ { 0, }
+};
+int arch_sel = 0;
+#define ARGS_TO_BYTES(x) 4*(ncitool_data[arch_sel].args_to_bytes)
+#define UserModeStub ncitool_data[arch_sel].um_stub
+#define KernelModeStub ncitool_data[arch_sel].km_stub
+#define GlobalHeader ncitool_data[arch_sel].global_header
+#define Declaration ncitool_data[arch_sel].declaration
/* FUNCTIONS ****************************************************************/
unsigned StackBytes)
{
/* Export the function */
- fprintf(StubFile, ".global _%s@%d\n", SyscallName, StackBytes);
+ fprintf(StubFile, GlobalHeader, SyscallName, StackBytes);
/* Define it */
- fprintf(StubFile, "_%s@%d:\n\n", SyscallName, StackBytes);
+ fprintf(StubFile, Declaration, SyscallName, StackBytes);
}
void usage(char * argv0)
{
- printf("Usage: %s sysfuncs.lst w32ksvc.db napi.h ssdt.h napi.S zw.S win32k.S win32k.S\n"
+ printf("Usage: %s [-arch <arch>] sysfuncs.lst w32ksvc.db napi.h ssdt.h napi.S zw.S win32k.S win32k.S\n"
" sysfuncs.lst native system functions database\n"
" w32ksvc.db native graphic functions database\n"
" napi.h NTOSKRNL service table\n"
" napi.S NTDLL stubs\n"
" zw.S NTOSKRNL Zw stubs\n"
" win32k.S GDI32 stubs\n"
- " win32k.S USER32 stubs\n",
- argv0
+ " win32k.S USER32 stubs\n"
+ " -arch is optional, default is %s\n",
+ argv0,
+ ncitool_data[0].arch
);
}
int main(int argc, char* argv[])
{
- FILE * Files[Arguments];
- int FileNumber;
+ FILE * Files[Arguments] = { };
+ int FileNumber, ArgOffset = 1;
char * OpenType = "r";
+ /* Catch architecture argument */
+ if (argc > 3 && !strcmp(argv[1],"-arch")) {
+ for( arch_sel = 0; ncitool_data[arch_sel].arch; arch_sel++ )
+ if (strcmp(argv[2],ncitool_data[arch_sel].arch) == 0)
+ break;
+ if (!ncitool_data[arch_sel].arch) {
+ printf("Invalid arch '%s'\n", argv[2]);
+ usage(argv[0]);
+ return 1;
+ }
+ ArgOffset = 3;
+ }
/* Make sure all arguments all there */
- if (argc != Arguments + 1) {
+ if (argc != Arguments + ArgOffset) {
usage(argv[0]);
return(1);
}
/* Open the File */
if (FileNumber == 2) OpenType = "wb";
- Files[FileNumber] = fopen(argv[FileNumber + 1], OpenType);
+ Files[FileNumber] = fopen(argv[FileNumber + ArgOffset], OpenType);
/* Check for failure and error out if so */
if (!Files[FileNumber]) {
- perror(argv[FileNumber + 1]);
+ perror(argv[FileNumber + ArgOffset]);
return (1);
}
-
}
/* Write the File Headers */
WriteFileHeader(Files[NtosUserStubs],
"System Call Stubs for Native API",
- argv[NtosUserStubs + 1]);
+ argv[NtosUserStubs + ArgOffset]);
WriteFileHeader(Files[NtosKernelStubs],
"System Call Stubs for Native API",
- argv[NtosKernelStubs + 1]);
+ argv[NtosKernelStubs + ArgOffset]);
fputs("#include <ndk/asm.h>\n\n", Files[NtosKernelStubs]);
WriteFileHeader(Files[Win32kGdiStubs],
"System Call Stubs for Native API",
- argv[Win32kGdiStubs + 1]);
+ argv[Win32kGdiStubs + ArgOffset]);
WriteFileHeader(Files[Win32kUserStubs],
"System Call Stubs for Native API",
- argv[Win32kUserStubs + 1]);
+ argv[Win32kUserStubs + ArgOffset]);
/* Create the System Stubs */
CreateSystemServiceTable(Files[NativeSystemDb],
Files[NtosServiceTable],
"Main",
- argv[NtosServiceTable + 1]);
+ argv[NtosServiceTable + ArgOffset]);
CreateSystemServiceTable(Files[NativeGuiDb],
Files[Win32kServiceTable],
"Win32k",
- argv[Win32kServiceTable + 1]);
+ argv[Win32kServiceTable + ArgOffset]);
/* Close all files */
- for (FileNumber = 0; FileNumber < Arguments; FileNumber++) {
+ for (FileNumber = 0; FileNumber < Arguments-ArgOffset; FileNumber++) {
/* Close the File */
fclose(Files[FileNumber]);