mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-03 04:13:31 +00:00
Make ncitool create syscall stubs for amd64. We use the same as for x86 for now.
svn path=/branches/ros-amd64-bringup/; revision=34700
This commit is contained in:
+76
-74
@@ -4,7 +4,7 @@
|
||||
* PROJECT: Native Call Interface Support Tool
|
||||
* PURPOSE: Generates NCI Tables and Stubs.
|
||||
* PROGRAMMER; Alex Ionescu ([email protected])
|
||||
* CHANGE HISTORY: 14/01/05 - Created. Based on original code by
|
||||
* CHANGE HISTORY: 14/01/05 - Created. Based on original code by
|
||||
* KJK::Hyperion and Emanuelle Aliberti.
|
||||
*
|
||||
*/
|
||||
@@ -44,9 +44,9 @@
|
||||
/********** Stub Code ************/
|
||||
|
||||
/*
|
||||
* This stubs calls into KUSER_SHARED_DATA where either a
|
||||
* This stubs calls into KUSER_SHARED_DATA where either a
|
||||
* sysenter or interrupt is performed, depending on CPU support.
|
||||
*/
|
||||
*/
|
||||
#if defined(__GNUC__)
|
||||
#define UserModeStub_x86 " movl $0x%x, %%eax\n" \
|
||||
" movl $KUSER_SHARED_SYSCALL, %%ecx\n" \
|
||||
@@ -84,7 +84,7 @@
|
||||
|
||||
/*
|
||||
* This stub calls KiSystemService directly with a fake INT2E stack.
|
||||
* Because EIP is pushed during the call, the handler will return here.
|
||||
* Because EIP is pushed during the call, the handler will return here.
|
||||
*/
|
||||
#if defined(__GNUC__)
|
||||
#define KernelModeStub_x86 " movl $0x%x, %%eax\n" \
|
||||
@@ -130,6 +130,8 @@ struct ncitool_data_t {
|
||||
struct ncitool_data_t ncitool_data[] = {
|
||||
{ "i386", 4, KernelModeStub_x86, UserModeStub_x86,
|
||||
".global _%s@%d\n", "_%s@%d:\n" },
|
||||
{ "amd64", 4, KernelModeStub_x86, UserModeStub_x86,
|
||||
".global _%s@%d\n", "_%s@%d:\n" },
|
||||
{ "powerpc", 4, KernelModeStub_ppc, UserModeStub_ppc,
|
||||
"\t.globl %s\n", "%s:\n" },
|
||||
{ "mips", 4, KernelModeStub_mips, UserModeStub_mips,
|
||||
@@ -148,7 +150,7 @@ int arch_sel = 0;
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
/*++
|
||||
* WriteFileHeader
|
||||
* WriteFileHeader
|
||||
*
|
||||
* Prints out the File Header for a Stub File.
|
||||
*
|
||||
@@ -166,7 +168,7 @@ int arch_sel = 0;
|
||||
* FileLocation is only used for printing the header.
|
||||
*
|
||||
*--*/
|
||||
void
|
||||
void
|
||||
WriteFileHeader(FILE * StubFile,
|
||||
char* FileDescription,
|
||||
char* FileLocation)
|
||||
@@ -185,7 +187,7 @@ WriteFileHeader(FILE * StubFile,
|
||||
}
|
||||
|
||||
/*++
|
||||
* WriteFileHeader
|
||||
* WriteFileHeader
|
||||
*
|
||||
* Prints out the File Header for a Stub File.
|
||||
*
|
||||
@@ -203,21 +205,21 @@ WriteFileHeader(FILE * StubFile,
|
||||
* FileLocation is only used for printing the header.
|
||||
*
|
||||
*--*/
|
||||
void
|
||||
WriteStubHeader(FILE* StubFile,
|
||||
char* SyscallName,
|
||||
void
|
||||
WriteStubHeader(FILE* StubFile,
|
||||
char* SyscallName,
|
||||
unsigned StackBytes)
|
||||
{
|
||||
/* Export the function */
|
||||
fprintf(StubFile, GlobalHeader, SyscallName, StackBytes);
|
||||
|
||||
|
||||
/* Define it */
|
||||
fprintf(StubFile, Declaration, SyscallName, StackBytes);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*++
|
||||
* WriteKernelModeStub
|
||||
* WriteKernelModeStub
|
||||
*
|
||||
* Prints out the Kernel Mode Stub for a System Call.
|
||||
*
|
||||
@@ -237,12 +239,12 @@ WriteStubHeader(FILE* StubFile,
|
||||
* On i386, StackBytes is the number of arguments x 4.
|
||||
*
|
||||
*--*/
|
||||
void
|
||||
WriteKernelModeStub(FILE* StubFile,
|
||||
char* SyscallName,
|
||||
void
|
||||
WriteKernelModeStub(FILE* StubFile,
|
||||
char* SyscallName,
|
||||
unsigned StackBytes,
|
||||
unsigned int SyscallId)
|
||||
{
|
||||
{
|
||||
/* Write the Stub Header and export the Function */
|
||||
WriteStubHeader(StubFile, SyscallName, StackBytes);
|
||||
|
||||
@@ -251,7 +253,7 @@ WriteKernelModeStub(FILE* StubFile,
|
||||
}
|
||||
|
||||
/*++
|
||||
* WriteUserModeStub
|
||||
* WriteUserModeStub
|
||||
*
|
||||
* Prints out the User Mode Stub for a System Call.
|
||||
*
|
||||
@@ -271,12 +273,12 @@ WriteKernelModeStub(FILE* StubFile,
|
||||
* On i386, StackBytes is the number of arguments x 4.
|
||||
*
|
||||
*--*/
|
||||
void
|
||||
WriteUserModeStub(FILE* StubFile,
|
||||
char* SyscallName,
|
||||
void
|
||||
WriteUserModeStub(FILE* StubFile,
|
||||
char* SyscallName,
|
||||
unsigned StackBytes,
|
||||
unsigned int SyscallId)
|
||||
{
|
||||
{
|
||||
/* Write the Stub Header and export the Function */
|
||||
WriteStubHeader(StubFile, SyscallName, StackBytes);
|
||||
|
||||
@@ -285,7 +287,7 @@ WriteUserModeStub(FILE* StubFile,
|
||||
}
|
||||
|
||||
/*++
|
||||
* GetNameAndArgumentsFromDb
|
||||
* GetNameAndArgumentsFromDb
|
||||
*
|
||||
* Parses an entry from a System Call Database, extracting
|
||||
* the function's name and arguments that it takes.
|
||||
@@ -305,23 +307,23 @@ WriteUserModeStub(FILE* StubFile,
|
||||
* On i386, StackBytes is the number of arguments x 4.
|
||||
*
|
||||
*--*/
|
||||
void
|
||||
void
|
||||
GetNameAndArgumentsFromDb(char Line[],
|
||||
char ** NtSyscallName,
|
||||
char ** SyscallArguments)
|
||||
{
|
||||
char *s;
|
||||
char *stmp;
|
||||
|
||||
|
||||
/* Remove new line */
|
||||
if ((s = (char *) strchr(Line,'\r')) != NULL) {
|
||||
*s = '\0';
|
||||
}
|
||||
|
||||
|
||||
/* Skip comments (#) and empty lines */
|
||||
s = &Line[0];
|
||||
if ((*s) != '#' && (*s) != '\0') {
|
||||
|
||||
|
||||
/* Extract the NtXXX name */
|
||||
*NtSyscallName = (char *)strtok(s," \t");
|
||||
|
||||
@@ -332,9 +334,9 @@ GetNameAndArgumentsFromDb(char Line[],
|
||||
if ((stmp = strchr(*SyscallArguments, '\n')) != NULL) {
|
||||
*stmp = '\0';
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
/* Skip this entry */
|
||||
*NtSyscallName = NULL;
|
||||
*SyscallArguments = NULL;
|
||||
@@ -342,7 +344,7 @@ GetNameAndArgumentsFromDb(char Line[],
|
||||
}
|
||||
|
||||
/*++
|
||||
* CreateStubs
|
||||
* CreateStubs
|
||||
*
|
||||
* Parses a System Call Database and creates stubs for all the entries.
|
||||
*
|
||||
@@ -379,28 +381,28 @@ CreateStubs(FILE * SyscallDb,
|
||||
char *SyscallArguments;
|
||||
int SyscallId;
|
||||
unsigned StackBytes;
|
||||
|
||||
|
||||
/* We loop, incrementing the System Call Index, until the end of the file */
|
||||
for (SyscallId = 0; ((!feof(SyscallDb)) && (fgets(Line, sizeof(Line), SyscallDb) != NULL));) {
|
||||
|
||||
|
||||
/* Extract the Name and Arguments */
|
||||
GetNameAndArgumentsFromDb(Line, &NtSyscallName, &SyscallArguments);
|
||||
GetNameAndArgumentsFromDb(Line, &NtSyscallName, &SyscallArguments);
|
||||
if (SyscallArguments != NULL)
|
||||
StackBytes = ARGS_TO_BYTES(strtoul(SyscallArguments, NULL, 0));
|
||||
else
|
||||
StackBytes = 0;
|
||||
|
||||
|
||||
/* Make sure we really extracted something */
|
||||
if (NtSyscallName) {
|
||||
|
||||
|
||||
/* Create Usermode Stubs for Nt/Zw syscalls in each Usermode file */
|
||||
int i;
|
||||
for (i= 0; i < UserFiles; i++) {
|
||||
|
||||
|
||||
/* Write the Nt Version */
|
||||
WriteUserModeStub(UserModeFiles[i],
|
||||
NtSyscallName,
|
||||
StackBytes,
|
||||
WriteUserModeStub(UserModeFiles[i],
|
||||
NtSyscallName,
|
||||
StackBytes,
|
||||
SyscallId | Index);
|
||||
|
||||
/* If a Zw Version is needed (was specified), write it too */
|
||||
@@ -426,7 +428,7 @@ CreateStubs(FILE * SyscallDb,
|
||||
StackBytes,
|
||||
SyscallId | Index);
|
||||
}
|
||||
|
||||
|
||||
/* Only increase if we actually added something */
|
||||
SyscallId++;
|
||||
}
|
||||
@@ -434,7 +436,7 @@ CreateStubs(FILE * SyscallDb,
|
||||
}
|
||||
|
||||
/*++
|
||||
* CreateSystemServiceTable
|
||||
* CreateSystemServiceTable
|
||||
*
|
||||
* Parses a System Call Database and creates a System Call Service Table for it.
|
||||
*
|
||||
@@ -455,7 +457,7 @@ CreateStubs(FILE * SyscallDb,
|
||||
*
|
||||
*--*/
|
||||
void
|
||||
CreateSystemServiceTable(FILE *SyscallDb,
|
||||
CreateSystemServiceTable(FILE *SyscallDb,
|
||||
FILE *SyscallTable,
|
||||
char * Name,
|
||||
char * FileLocation)
|
||||
@@ -477,21 +479,21 @@ CreateSystemServiceTable(FILE *SyscallDb,
|
||||
|
||||
/* Extract the Name and Arguments */
|
||||
GetNameAndArgumentsFromDb(Line, &NtSyscallName, &SyscallArguments);
|
||||
|
||||
|
||||
/* Make sure we really extracted something */
|
||||
if (NtSyscallName) {
|
||||
|
||||
|
||||
/* Add a new line */
|
||||
if (SyscallId > 0) fprintf(SyscallTable,",\n");
|
||||
|
||||
|
||||
/* Write the syscall name in the service table. */
|
||||
fprintf(SyscallTable,"\t\t(ULONG_PTR)%s", NtSyscallName);
|
||||
|
||||
|
||||
/* Only increase if we actually added something */
|
||||
SyscallId++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Close the service table (C syntax) */
|
||||
fprintf(SyscallTable,"\n};\n");
|
||||
|
||||
@@ -504,24 +506,24 @@ CreateSystemServiceTable(FILE *SyscallDb,
|
||||
|
||||
/* Extract the Name and Arguments */
|
||||
GetNameAndArgumentsFromDb(Line, &NtSyscallName, &SyscallArguments);
|
||||
|
||||
|
||||
/* Make sure we really extracted something */
|
||||
if (NtSyscallName) {
|
||||
|
||||
|
||||
/* Add a new line */
|
||||
if (SyscallId > 0) fprintf(SyscallTable,",\n");
|
||||
|
||||
|
||||
/* Write the syscall arguments in the argument table. */
|
||||
if (SyscallArguments != NULL)
|
||||
fprintf(SyscallTable,"\t\t%lu * sizeof(void *)",strtoul(SyscallArguments, NULL, 0));
|
||||
else
|
||||
fprintf(SyscallTable,"\t\t0");
|
||||
|
||||
|
||||
/* Only increase if we actually added something */
|
||||
SyscallId++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Close the service table (C syntax) */
|
||||
fprintf(SyscallTable,"\n};\n");
|
||||
|
||||
@@ -574,14 +576,14 @@ int main(int argc, char* argv[])
|
||||
usage(argv[0]);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* Open all Output and bail out if any fail */
|
||||
for (FileNumber = 0; FileNumber < Arguments; FileNumber++) {
|
||||
|
||||
|
||||
/* Open the File */
|
||||
if (FileNumber == 2) OpenType = "wb";
|
||||
Files[FileNumber] = fopen(argv[FileNumber + ArgOffset], OpenType);
|
||||
|
||||
|
||||
/* Check for failure and error out if so */
|
||||
if (!Files[FileNumber]) {
|
||||
perror(argv[FileNumber + ArgOffset]);
|
||||
@@ -590,32 +592,32 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
|
||||
/* Write the File Headers */
|
||||
WriteFileHeader(Files[NtosUserStubs],
|
||||
"System Call Stubs for Native API",
|
||||
WriteFileHeader(Files[NtosUserStubs],
|
||||
"System Call Stubs for Native API",
|
||||
argv[NtosUserStubs + ArgOffset]);
|
||||
|
||||
WriteFileHeader(Files[NtosKernelStubs],
|
||||
"System Call Stubs for Native API",
|
||||
|
||||
WriteFileHeader(Files[NtosKernelStubs],
|
||||
"System Call Stubs for Native API",
|
||||
argv[NtosKernelStubs + ArgOffset]);
|
||||
fputs("#include <ndk/asm.h>\n\n", Files[NtosKernelStubs]);
|
||||
|
||||
WriteFileHeader(Files[Win32kStubs],
|
||||
"System Call Stubs for Native API",
|
||||
WriteFileHeader(Files[Win32kStubs],
|
||||
"System Call Stubs for Native API",
|
||||
argv[Win32kStubs + ArgOffset]);
|
||||
|
||||
/* Create the System Stubs */
|
||||
CreateStubs(Files[NativeSystemDb],
|
||||
&Files[NtosUserStubs],
|
||||
Files[NtosKernelStubs],
|
||||
MAIN_INDEX,
|
||||
&Files[NtosUserStubs],
|
||||
Files[NtosKernelStubs],
|
||||
MAIN_INDEX,
|
||||
1,
|
||||
1);
|
||||
|
||||
/* Create the Graphics Stubs */
|
||||
CreateStubs(Files[NativeGuiDb],
|
||||
&Files[Win32kStubs],
|
||||
NULL,
|
||||
WIN32K_INDEX,
|
||||
CreateStubs(Files[NativeGuiDb],
|
||||
&Files[Win32kStubs],
|
||||
NULL,
|
||||
WIN32K_INDEX,
|
||||
1,
|
||||
0);
|
||||
|
||||
@@ -624,22 +626,22 @@ int main(int argc, char* argv[])
|
||||
rewind(Files[NativeGuiDb]);
|
||||
|
||||
/* Create the Service Tables */
|
||||
CreateSystemServiceTable(Files[NativeSystemDb],
|
||||
CreateSystemServiceTable(Files[NativeSystemDb],
|
||||
Files[NtosServiceTable],
|
||||
"Main",
|
||||
argv[NtosServiceTable + ArgOffset]);
|
||||
|
||||
CreateSystemServiceTable(Files[NativeGuiDb],
|
||||
|
||||
CreateSystemServiceTable(Files[NativeGuiDb],
|
||||
Files[Win32kServiceTable],
|
||||
"Win32k",
|
||||
argv[Win32kServiceTable + ArgOffset]);
|
||||
|
||||
/* Close all files */
|
||||
for (FileNumber = 0; FileNumber < Arguments-ArgOffset; FileNumber++) {
|
||||
|
||||
|
||||
/* Close the File */
|
||||
fclose(Files[FileNumber]);
|
||||
|
||||
|
||||
}
|
||||
|
||||
return(0);
|
||||
|
||||
Reference in New Issue
Block a user