Implemented NtOpenSymbolicLinkObjecft & NtQuerySymbolicLinkObject from Dxbx

Not sure if translated correctly, probably shouldn't attempt to code at 2am
This commit is contained in:
Luke Usher 2016-08-20 01:49:58 +01:00
parent d5976c8e13
commit ac832097a9
3 changed files with 105 additions and 4 deletions

View File

@ -159,7 +159,11 @@ XBSYSAPI EXPORTNUM(202) NTSTATUS NTAPI NtOpenFile
IN ULONG OpenOptions
);
XBSYSAPI VOID *NtOpenSymbolicLinkObject;
XBSYSAPI EXPORTNUM(203) NTSTATUS NTAPI NtOpenSymbolicLinkObject(
OUT PHANDLE LinkHandle,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
XBSYSAPI VOID *NtProtectVirtualMemory;
XBSYSAPI VOID *NtPulseEvent;
@ -223,7 +227,13 @@ XBSYSAPI EXPORTNUM(211) NTSTATUS NTAPI NtQueryInformationFile
XBSYSAPI VOID *NtQueryIoCompletion;
XBSYSAPI VOID *NtQueryMutant;
XBSYSAPI VOID *NtQuerySemaphore;
XBSYSAPI VOID *NtQuerySymbolicLinkObject;
XBSYSAPI EXPORTNUM(215) NTSTATUS NTAPI NtQuerySymbolicLinkObject(
HANDLE LinkHandle,
OUT PSTRING LinkTarget,
OUT PULONG ReturnedLength OPTIONAL
);
XBSYSAPI VOID *NtQueryTimer;
// ******************************************************************

View File

@ -3263,6 +3263,46 @@ XBSYSAPI EXPORTNUM(202) xboxkrnl::NTSTATUS NTAPI xboxkrnl::NtOpenFile
return NtCreateFile(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, NULL, 0, ShareAccess, FILE_OPEN, OpenOptions);
}
// ******************************************************************
// * 0x00CB - NtOpenSymbolicLinkObject
// ******************************************************************
XBSYSAPI EXPORTNUM(203) xboxkrnl::NTSTATUS NTAPI xboxkrnl::NtOpenSymbolicLinkObject(
OUT PHANDLE LinkHandle,
IN POBJECT_ATTRIBUTES ObjectAttributes
)
{
EmuSwapFS();
DbgPrintf("EmuKrnl (0x%X): NtOpenSymbolicLinkObject\n"
"(\n"
" LinkHandle : 0x%.08X\n"
" ObjectAttributes : 0x%.08X\n"
");\n",
GetCurrentThreadId(), LinkHandle, ObjectAttributes);
NTSTATUS ret = 0;
EmuNtSymbolicLinkObject* symbolicLinkObject = NULL;
// Find the TEmuNtSymbolicLinkObject via the name in ObjectAttributes :
symbolicLinkObject = FindNtSymbolicLinkObjectByName(std::string(ObjectAttributes->ObjectName->Buffer, ObjectAttributes->ObjectName->Length));
if ((symbolicLinkObject != NULL))
{
// Return a new handle
*LinkHandle = EmuHandleToPtr(symbolicLinkObject);
ret = STATUS_SUCCESS;
}
else
if (ret != STATUS_SUCCESS)
EmuWarning("NtOpenSymbolicLinkObject failed! (%s)", (NtStatusToString(ret)));
else
DbgPrintf("EmuKrnl : NtOpenSymbolicLinkObject LinkHandle^ = 0x%.08X", *LinkHandle);
EmuSwapFS();
return ret;
}
// ******************************************************************
// * 0x00CE - NtQueueApcThread
// ******************************************************************
@ -3496,6 +3536,57 @@ XBSYSAPI EXPORTNUM(211) xboxkrnl::NTSTATUS NTAPI xboxkrnl::NtQueryInformationFil
return ret;
}
// ******************************************************************
// * 0x00D7 - NtQuerySymbolicLinkObject
// ******************************************************************
XBSYSAPI EXPORTNUM(215) xboxkrnl::NTSTATUS NTAPI xboxkrnl::NtQuerySymbolicLinkObject(
HANDLE LinkHandle,
OUT PSTRING LinkTarget,
OUT PULONG ReturnedLength OPTIONAL
)
{
EmuSwapFS();
DbgPrintf("EmuKrnl (0x%X): NtQuerySymbolicLinkObject\n"
"(\n"
" LinkHandle : 0x%.08X\n"
" LinkTarget : 0x%.08X\n"
" ReturnedLength : 0x%.08X\n"
");\n", LinkHandle, LinkTarget, ReturnedLength);
NTSTATUS result = 0;
EmuNtSymbolicLinkObject* symbolicLinkObject = NULL;
// Check that we actually got an EmuHandle :
result = STATUS_INVALID_HANDLE;
// Retrieve the NtSymbolicLinkObject and populate the output arguments :
result = STATUS_SUCCESS;
symbolicLinkObject = ((EmuNtSymbolicLinkObject*)PtrToEmuHandle((EmuHandle*)LinkHandle));
if ((LinkTarget != NULL)) {
if (LinkTarget->Length > LinkTarget->MaximumLength) {
result = STATUS_BUFFER_TOO_SMALL;
LinkTarget->Length = LinkTarget->MaximumLength;
}
memcpy(LinkTarget->Buffer, symbolicLinkObject->XboxFullPath.c_str(), LinkTarget->Length);
}
if ((ReturnedLength != NULL))
{
*ReturnedLength = symbolicLinkObject->XboxFullPath.length(); // Return full length (even if buffer was too small)
}
if (result != STATUS_SUCCESS)
EmuWarning("NtQuerySymbolicLinkObject failed! (%s)", NtStatusToString(result));
EmuSwapFS();
return result;
}
// ******************************************************************
// * 0x00D9 - NtQueryVirtualMemory
// ******************************************************************

View File

@ -260,7 +260,7 @@ extern "C" CXBXKRNL_API uint32 CxbxKrnl_KernelThunkTable[367] =
(uint32)PANIC(0x00C8), // 0x00C8 (200) NtFsControlFile
(uint32)PANIC(0x00C9), // 0x00C9 (201) NtOpenDirectoryObject
(uint32)&xboxkrnl::NtOpenFile, // 0x00CA (202)
(uint32)PANIC(0x00CB), // 0x00CB (203) NtOpenSymbolicLinkObject
(uint32)&xboxkrnl::NtOpenSymbolicLinkObject, // 0x00CB (203) NtOpenSymbolicLinkObject
(uint32)PANIC(0x00CC), // 0x00CC (204) NtProtectVirtualMemory
(uint32)PANIC(0x00CD), // 0x00CD (205) NtPulseEvent
(uint32)&xboxkrnl::NtQueueApcThread, // 0x00CE (206)
@ -272,7 +272,7 @@ extern "C" CXBXKRNL_API uint32 CxbxKrnl_KernelThunkTable[367] =
(uint32)PANIC(0x00D4), // 0x00D4 (212) NtQueryIoCompletion
(uint32)PANIC(0x00D5), // 0x00D5 (213) NtQueryMutant
(uint32)PANIC(0x00D6), // 0x00D6 (214) NtQuerySemaphore
(uint32)PANIC(0x00D7), // 0x00D7 (215) NtQuerySymbolicLinkObject
(uint32)&xboxkrnl::NtQuerySymbolicLinkObject, // 0x00D7 (215) NtQuerySymbolicLinkObject
(uint32)PANIC(0x00D8), // 0x00D8 (216) NtQueryTimer
(uint32)&xboxkrnl::NtQueryVirtualMemory, // 0x00D9 (217)
(uint32)&xboxkrnl::NtQueryVolumeInformationFile,// 0x00DA (218)