diff --git a/libctru/include/3ds.h b/libctru/include/3ds.h index d4079d8..69b2ddf 100644 --- a/libctru/include/3ds.h +++ b/libctru/include/3ds.h @@ -46,6 +46,7 @@ extern "C" { #include <3ds/services/httpc.h> #include <3ds/services/uds.h> #include <3ds/services/ndm.h> +#include <3ds/services/nwmext.h> #include <3ds/services/ir.h> #include <3ds/services/ns.h> #include <3ds/services/pm.h> diff --git a/libctru/include/3ds/services/nwmext.h b/libctru/include/3ds/services/nwmext.h new file mode 100644 index 0000000..f6697c6 --- /dev/null +++ b/libctru/include/3ds/services/nwmext.h @@ -0,0 +1,13 @@ +#pragma once + +// Initializes NWMEXT. +Result nwmExtInit(void); + +// Exits NWMEXT. +void nwmExtExit(void); + +/** + * @brief Turns wireless on or off. + * @param enableWifi True enables it, false disables it. + */ +Result NWMEXT_ControlWirelessEnabled(bool enableWifi); diff --git a/libctru/source/services/nwmext.c b/libctru/source/services/nwmext.c new file mode 100644 index 0000000..2ea1f5b --- /dev/null +++ b/libctru/source/services/nwmext.c @@ -0,0 +1,38 @@ +#include <3ds/types.h> +#include <3ds/ipc.h> +#include <3ds/result.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/synchronization.h> +#include <3ds/services/nwmext.h> + +Handle nwmExtHandle; +static int nwmExtRefCount; + +Result nwmExtInit(void) +{ + Result res=0; + if (AtomicPostIncrement(&nwmExtRefCount)) return 0; + res = srvGetServiceHandle(&nwmExtHandle, "nwm::EXT"); + if (R_FAILED(res)) AtomicDecrement(&nwmExtRefCount); + return res; +} + +void nwmExtExit(void) +{ + if (AtomicDecrement(&nwmExtRefCount)) return; + svcCloseHandle(nwmExtHandle); +} + +Result NWMEXT_ControlWirelessEnabled(bool enableWifi) +{ + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x8, 1, 0); // 0x00080040 + cmdbuf[1] = enableWifi ? 0 : 1; + + Result ret=0; + if (R_FAILED(ret = svcSendSyncRequest(nwmExtHandle))) return ret; + + return cmdbuf[1]; +}