Line 1:
Line 1:
== Ioctl listing ==
== Ioctl listing ==
+
+
typedef struct _skd_timebuf//This is used by all ioctls for at least outbuf. For ioctl 0x18, inbuf addr & 3 is written to retval.
+
{
+
s32 retval;//Zero for success, -30 when "Universal time is not ready.".
+
u64 time;//UTC time in seconds.
+
} kd_timebuf;
{| class="wikitable"
{| class="wikitable"
Line 8:
Line 14:
! Output
! Output
! Notes
! Notes
+
|-
+
| 0x14
+
| NWC24iGetUniversalTime
+
| none
+
| 12 bytes
+
| Writes the current UTC time to inbuf kd_timebuf->time.
+
|-
+
| 0x15
+
| NWC24iSetUniversalTime
+
| 12 bytes
+
| 4 bytes
+
| Sets the current UTC time to inbuf kd_timebuf->time.
+
|-
+
| 0x16
+
| Undefined
+
| none
+
| none
+
| always returns -9
|-
|-
| 0x17
| 0x17
| NWC24iSetRtcCounter
| NWC24iSetRtcCounter
−
| 32 bytes
+
| 8 bytes
−
| 32 bytes
+
| 4 bytes
−
|
+
| Corrects the internal KD RTC by adding the input u64.
|-
|-
| 0x18
| 0x18
| NWC24iGetTimeDifference
| NWC24iGetTimeDifference
| none
| none
−
| 32 bytes
+
| 12 bytes
|
|
|}
|}
+
+
== Detailed Description ==
+
/dev/net/kd/time is used to get and set utc and rtc offsets. this is used by things like nwc24's scheduler and the module handles reading and editing of /shared2/wc24/misc.bin
+
+
=== KD_GetUTCTime ===
+
no inbuffer
+
+
outbuffer must be >= 0xC bytes and must be 0x4 aligned
+
+
if outbuffer is not >= 0xC bytes or outbuffer == NULL the IOS_Ioctl will return -4, else it returns 0
+
+
checks if a word is set in the module's memory that indicates the Universal time is ready and returns -30 in outbuffer->retval if not
+
+
outbuffer->time is set to the stored utc otherwise
+
+
=== KD_SetUTCTime ===
+
inbuffer must be >= 0xC bytes and must be 0x4 aligned
+
+
outbuffer must be >= 0x4 bytes and must be 0x4 aligned
+
+
if outbuffer or inbuffer is NULL or are not aligned the IOS_Ioctl will return -4, else it returns 0
+
+
struct inbuffer { u64 utc, u32 other_value };
+
+
checks that 0x30df3b00 <= utc <= 0xdfaef080 else it sets outbuffer->retval to -3
+
+
if utc is ok, it sets the module's struct containing the utc and the other_value
+
+
=== Undefined ===
+
no buffers checked
+
+
always returns -9 from IOS_Ioctl
+
+
=== NWC24iSetRtcCounter ===
+
inbuffer must be >= 0x8 bytes and must be 0x4 aligned
+
+
outbuffer must be >= 0x4 bytes and must be 0x4 aligned
+
+
if outbuffer or inbuffer is NULL or not aligned the IOS_Ioctl will return -4, else it returns 0
+
+
struct inbuffer { u32 rtc_value, u32 other_value };
+
+
other_value is checked for the lowest bit to be either 0 or 1 which sets a word in memory
+
+
this function messes with the /shared2/wc24/misc.bin file and by reading and writing utc data to/from it
+
+
it also sets utc when it needs to be synchronized due to offset
+
+
outbuffer->retval will always hold 0 if the IOS_Ioctl doesn't return -4
+
+
=== NWC24iGetTimeDifference ===
+
inbuffer is not checked
+
+
outbuffer must be >= 0xC bytes and must be 0x4 aligned
+
+
if outbuffer is NULL or not aligned the IOS_Ioctl will return -4
+
+
if the module's memory indicates no time difference the IOS_Ioctl will return -30
+
+
else it returns 0
+
+
outbuffer->retval could hold the outbuffer address & 3 if:
+
+
a) it wasn't doing a 32bit write to an unaligned address
+
+
b) it didn't jump to return -4 from the Ioctl when it was unaligned
+
+
so it'll always hold 0
+
+
outbuffer->time will hold the timedifference
+
+
[[Category:Wii Filesystem]]