Reimplemented NtSetSystemTime and KeQuerySystemTime
This should allow setting the Xbox system time without interfering with the host system time.
This commit is contained in:
parent
4bae6b721d
commit
a5199b9d3a
|
@ -76,6 +76,9 @@ volatile bool g_bEmuException = false;
|
||||||
volatile bool g_bEmuSuspended = false;
|
volatile bool g_bEmuSuspended = false;
|
||||||
volatile bool g_bPrintfOn = true;
|
volatile bool g_bPrintfOn = true;
|
||||||
|
|
||||||
|
// Delta added to host SystemTime, used in xboxkrnl::KeQuerySystemTime and xboxkrnl::NtSetSystemTime
|
||||||
|
LARGE_INTEGER HostSystemTimeDelta = {};
|
||||||
|
|
||||||
// Static Function(s)
|
// Static Function(s)
|
||||||
static int ExitException(LPEXCEPTION_POINTERS e);
|
static int ExitException(LPEXCEPTION_POINTERS e);
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,9 @@ extern int g_iThreadNotificationCount;
|
||||||
extern DWORD_PTR g_CPUXbox;
|
extern DWORD_PTR g_CPUXbox;
|
||||||
extern DWORD_PTR g_CPUOthers;
|
extern DWORD_PTR g_CPUOthers;
|
||||||
|
|
||||||
|
// Delta added to host SystemTime, used in xboxkrnl::KeQuerySystemTime and xboxkrnl::NtSetSystemTime
|
||||||
|
extern LARGE_INTEGER HostSystemTimeDelta;
|
||||||
|
|
||||||
// NOTE: this is an arbitrary latency
|
// NOTE: this is an arbitrary latency
|
||||||
#define XINPUT_SETSTATE_LATENCY 4
|
#define XINPUT_SETSTATE_LATENCY 4
|
||||||
#define XINPUT_SETSTATE_SLOTS 16
|
#define XINPUT_SETSTATE_SLOTS 16
|
||||||
|
@ -102,4 +105,5 @@ g_pXInputSetStateStatus[XINPUT_SETSTATE_SLOTS];
|
||||||
extern HANDLE g_hInputHandle[XINPUT_HANDLE_SLOTS];
|
extern HANDLE g_hInputHandle[XINPUT_HANDLE_SLOTS];
|
||||||
|
|
||||||
extern void InitializeSectionStructures(void);
|
extern void InitializeSectionStructures(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -313,13 +313,14 @@ XBSYSAPI EXPORTNUM(128) xboxkrnl::VOID NTAPI xboxkrnl::KeQuerySystemTime
|
||||||
{
|
{
|
||||||
LOG_FUNC_ONE_ARG(CurrentTime);
|
LOG_FUNC_ONE_ARG(CurrentTime);
|
||||||
|
|
||||||
// TODO: optimize for WinXP if speed ever becomes important here
|
if (CurrentTime != NULL)
|
||||||
|
{
|
||||||
|
LARGE_INTEGER HostSystemTime;
|
||||||
|
GetSystemTimeAsFileTime((LPFILETIME)&HostSystemTime); // Available since Windows 2000 (NOT on XP!)
|
||||||
|
|
||||||
SYSTEMTIME SystemTime;
|
// Apply the delta set in xboxkrnl::NtSetSystemTime to get the Xbox system time :
|
||||||
|
CurrentTime->QuadPart = HostSystemTime.QuadPart + HostSystemTimeDelta.QuadPart;
|
||||||
GetSystemTime(&SystemTime);
|
}
|
||||||
|
|
||||||
SystemTimeToFileTime(&SystemTime, (LPFILETIME)CurrentTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ******************************************************************
|
// ******************************************************************
|
||||||
|
|
|
@ -1808,7 +1808,7 @@ XBSYSAPI EXPORTNUM(211) xboxkrnl::NTSTATUS NTAPI xboxkrnl::NtQueryInformationFil
|
||||||
LOG_FUNC_ARG(FileInfo)
|
LOG_FUNC_ARG(FileInfo)
|
||||||
LOG_FUNC_END;
|
LOG_FUNC_END;
|
||||||
|
|
||||||
// TODO: IIRC, this function is depreciated. Maybe we should just use
|
// TODO: IIRC, this function is deprecated. Maybe we should just use
|
||||||
// ZwQueryInformationFile instead?
|
// ZwQueryInformationFile instead?
|
||||||
|
|
||||||
// if(FileInfo != FilePositionInformation && FileInfo != FileNetworkOpenInformation)
|
// if(FileInfo != FilePositionInformation && FileInfo != FileNetworkOpenInformation)
|
||||||
|
@ -2167,12 +2167,31 @@ XBSYSAPI EXPORTNUM(228) xboxkrnl::NTSTATUS NTAPI xboxkrnl::NtSetSystemTime
|
||||||
LOG_FUNC_ARG_OUT(PreviousTime)
|
LOG_FUNC_ARG_OUT(PreviousTime)
|
||||||
LOG_FUNC_END;
|
LOG_FUNC_END;
|
||||||
|
|
||||||
// Maybe it's not such a good idea to allow Cxbx to change your time
|
NTSTATUS ret = STATUS_SUCCESS; // TODO : Does Xbox returns STATUS_PRIVILEGE_NOT_HELD (supports SeSystemtimePrivlege)?
|
||||||
// clock. Might need admin privileges to do this.... dunno.
|
|
||||||
// TODO -oDxbx: Surely, we won't set the system time here, but we CAN remember a delta (and apply that in KeQuerySystemTime)
|
|
||||||
LOG_UNIMPLEMENTED();
|
|
||||||
|
|
||||||
NTSTATUS ret = STATUS_SUCCESS;
|
if (PreviousTime == NULL && SystemTime == NULL)
|
||||||
|
ret = STATUS_ACCESS_VIOLATION;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Surely, we won't set the system time here, but we CAN remember a delta to the host system time;
|
||||||
|
LARGE_INTEGER HostSystemTime;
|
||||||
|
GetSystemTimeAsFileTime((LPFILETIME)&HostSystemTime); // Available since Windows 2000 (NOT on XP!)
|
||||||
|
|
||||||
|
// Is the previous time requested?
|
||||||
|
if (PreviousTime != NULL)
|
||||||
|
// Apply current HostSystemTimeDelta, same as in xboxkrnl::KeQuerySystemTime :
|
||||||
|
PreviousTime->QuadPart = HostSystemTime.QuadPart + HostSystemTimeDelta.QuadPart;
|
||||||
|
|
||||||
|
// Is a new time given?
|
||||||
|
if (SystemTime != NULL)
|
||||||
|
{
|
||||||
|
if (SystemTime->QuadPart > 0)
|
||||||
|
// Calculate new HostSystemTimeDelta, to be used in xboxkrnl::KeQuerySystemTime :
|
||||||
|
HostSystemTimeDelta.QuadPart = HostSystemTime.QuadPart - SystemTime->QuadPart;
|
||||||
|
else
|
||||||
|
ret = STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
RETURN(ret);
|
RETURN(ret);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue