RtlTimeToTimeFields / RtlTimeFieldsToTime. TZ may be wrong.
This commit is contained in:
parent
73200ff0bc
commit
de140796a5
|
@ -76,6 +76,8 @@ void XTimer::CompletionRoutine(
|
||||||
// Queue APC to call back routine with (arg, low, high).
|
// Queue APC to call back routine with (arg, low, high).
|
||||||
// TODO(benvanik): APC dispatch.
|
// TODO(benvanik): APC dispatch.
|
||||||
XELOGE("Timer needs APC!");
|
XELOGE("Timer needs APC!");
|
||||||
|
|
||||||
|
DebugBreak();
|
||||||
}
|
}
|
||||||
|
|
||||||
X_STATUS XTimer::Cancel() {
|
X_STATUS XTimer::Cancel() {
|
||||||
|
|
|
@ -867,6 +867,60 @@ SHIM_CALL RtlLeaveCriticalSection_shim(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SHIM_CALL RtlTimeToTimeFields_shim(
|
||||||
|
PPCContext* ppc_state, KernelState* state) {
|
||||||
|
uint32_t time_ptr = SHIM_GET_ARG_32(0);
|
||||||
|
uint32_t time_fields_ptr = SHIM_GET_ARG_32(1);
|
||||||
|
|
||||||
|
XELOGD("RtlTimeToTimeFields(%.8X, %.8X)", time_ptr, time_fields_ptr);
|
||||||
|
|
||||||
|
uint64_t time = SHIM_MEM_64(time_ptr);
|
||||||
|
FILETIME ft;
|
||||||
|
ft.dwHighDateTime = time >> 32;
|
||||||
|
ft.dwLowDateTime = (uint32_t)time;
|
||||||
|
|
||||||
|
SYSTEMTIME st;
|
||||||
|
FileTimeToSystemTime(&ft, &st);
|
||||||
|
|
||||||
|
SHIM_SET_MEM_16(time_fields_ptr + 0, st.wYear);
|
||||||
|
SHIM_SET_MEM_16(time_fields_ptr + 2, st.wMonth);
|
||||||
|
SHIM_SET_MEM_16(time_fields_ptr + 4, st.wDay);
|
||||||
|
SHIM_SET_MEM_16(time_fields_ptr + 6, st.wHour);
|
||||||
|
SHIM_SET_MEM_16(time_fields_ptr + 8, st.wMinute);
|
||||||
|
SHIM_SET_MEM_16(time_fields_ptr + 10, st.wSecond);
|
||||||
|
SHIM_SET_MEM_16(time_fields_ptr + 12, st.wMilliseconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SHIM_CALL RtlTimeFieldsToTime_shim(
|
||||||
|
PPCContext* ppc_state, KernelState* state) {
|
||||||
|
uint32_t time_fields_ptr = SHIM_GET_ARG_32(0);
|
||||||
|
uint32_t time_ptr = SHIM_GET_ARG_32(1);
|
||||||
|
|
||||||
|
XELOGD("RtlTimeFieldsToTime(%.8X, %.8X)", time_fields_ptr, time_ptr);
|
||||||
|
|
||||||
|
SYSTEMTIME st;
|
||||||
|
st.wYear = SHIM_MEM_16(time_fields_ptr + 0);
|
||||||
|
st.wMonth = SHIM_MEM_16(time_fields_ptr + 2);
|
||||||
|
st.wDay = SHIM_MEM_16(time_fields_ptr + 4);
|
||||||
|
st.wHour = SHIM_MEM_16(time_fields_ptr + 6);
|
||||||
|
st.wMinute = SHIM_MEM_16(time_fields_ptr + 8);
|
||||||
|
st.wSecond = SHIM_MEM_16(time_fields_ptr + 10);
|
||||||
|
st.wMilliseconds = SHIM_MEM_16(time_fields_ptr + 12);
|
||||||
|
|
||||||
|
FILETIME ft;
|
||||||
|
if (!SystemTimeToFileTime(&st, &ft)) {
|
||||||
|
// set last error = ERROR_INVALID_PARAMETER
|
||||||
|
SHIM_SET_RETURN(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t time = (uint64_t(ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
|
||||||
|
SHIM_SET_MEM_64(time_ptr, time);
|
||||||
|
SHIM_SET_RETURN(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace kernel
|
} // namespace kernel
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
||||||
|
@ -885,6 +939,9 @@ void xe::kernel::xboxkrnl::RegisterRtlExports(
|
||||||
|
|
||||||
SHIM_SET_MAPPING("xboxkrnl.exe", _vsnprintf, state);
|
SHIM_SET_MAPPING("xboxkrnl.exe", _vsnprintf, state);
|
||||||
|
|
||||||
|
SHIM_SET_MAPPING("xboxkrnl.exe", RtlTimeToTimeFields, state);
|
||||||
|
SHIM_SET_MAPPING("xboxkrnl.exe", RtlTimeFieldsToTime, state);
|
||||||
|
|
||||||
SHIM_SET_MAPPING("xboxkrnl.exe", RtlNtStatusToDosError, state);
|
SHIM_SET_MAPPING("xboxkrnl.exe", RtlNtStatusToDosError, state);
|
||||||
|
|
||||||
SHIM_SET_MAPPING("xboxkrnl.exe", RtlImageXexHeaderField, state);
|
SHIM_SET_MAPPING("xboxkrnl.exe", RtlImageXexHeaderField, state);
|
||||||
|
|
Loading…
Reference in New Issue