Implemented NtOpenSymbolicLinkObjecft & NtQuerySymbolicLinkObject from Dxbx
Not sure if translated correctly, probably shouldn't attempt to code at 2am
This commit is contained in:
parent
d5976c8e13
commit
ac832097a9
|
@ -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;
|
||||
|
||||
// ******************************************************************
|
||||
|
|
|
@ -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
|
||||
// ******************************************************************
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue