Merge pull request #259 from yuriks/patch-1

Fix crash when getting or setting struct params in CAM:U
This commit is contained in:
mtheall 2016-02-03 02:45:00 -06:00
commit f700005701

View File

@ -6,6 +6,7 @@
#include <3ds/types.h> #include <3ds/types.h>
#include <3ds/result.h> #include <3ds/result.h>
#include <3ds/ipc.h> #include <3ds/ipc.h>
#include <string.h>
Handle camHandle; Handle camHandle;
static int camRefCount; static int camRefCount;
@ -534,7 +535,7 @@ Result CAMU_GetStereoCameraCalibrationData(CAMU_StereoCameraCalibrationData* dat
cmdbuf[0] = IPC_MakeHeader(0x2B,0,0); // 0x2B0000 cmdbuf[0] = IPC_MakeHeader(0x2B,0,0); // 0x2B0000
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*data = *(CAMU_StereoCameraCalibrationData*) cmdbuf[2]; memcpy(data, &cmdbuf[2], sizeof(*data));
return cmdbuf[1]; return cmdbuf[1];
} }
@ -542,7 +543,7 @@ Result CAMU_SetStereoCameraCalibrationData(CAMU_StereoCameraCalibrationData data
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x2C,16,0); // 0x2C0400 cmdbuf[0] = IPC_MakeHeader(0x2C,16,0); // 0x2C0400
*(CAMU_StereoCameraCalibrationData*) cmdbuf[1] = data; memcpy(&cmdbuf[1], &data, sizeof(data));
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];
@ -600,7 +601,7 @@ Result CAMU_SetImageQualityCalibrationData(CAMU_ImageQualityCalibrationData data
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x31,6,0); // 0x310180 cmdbuf[0] = IPC_MakeHeader(0x31,6,0); // 0x310180
*(CAMU_ImageQualityCalibrationData*) cmdbuf[1] = data; memcpy(&cmdbuf[1], &data, sizeof(data));
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];
@ -612,7 +613,7 @@ Result CAMU_GetImageQualityCalibrationData(CAMU_ImageQualityCalibrationData* dat
cmdbuf[0] = IPC_MakeHeader(0x32,0,0); // 0x320000 cmdbuf[0] = IPC_MakeHeader(0x32,0,0); // 0x320000
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*data = *(CAMU_ImageQualityCalibrationData*) cmdbuf[2]; memcpy(data, &cmdbuf[2], sizeof(*data));
return cmdbuf[1]; return cmdbuf[1];
} }
@ -620,7 +621,7 @@ Result CAMU_SetPackageParameterWithoutContext(CAMU_PackageParameterCameraSelect
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x33,11,0); // 0x3302C0 cmdbuf[0] = IPC_MakeHeader(0x33,11,0); // 0x3302C0
*(CAMU_PackageParameterCameraSelect*) cmdbuf[1] = param; memcpy(&cmdbuf[1], &param, sizeof(param));
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];
@ -630,7 +631,7 @@ Result CAMU_SetPackageParameterWithContext(CAMU_PackageParameterContext param) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x34,5,0); // 0x340140 cmdbuf[0] = IPC_MakeHeader(0x34,5,0); // 0x340140
*(CAMU_PackageParameterContext*) cmdbuf[1] = param; memcpy(&cmdbuf[1], &param, sizeof(param));
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];
@ -640,7 +641,7 @@ Result CAMU_SetPackageParameterWithContextDetail(CAMU_PackageParameterContextDet
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x35,7,0); // 0x3501C0 cmdbuf[0] = IPC_MakeHeader(0x35,7,0); // 0x3501C0
*(CAMU_PackageParameterContextDetail*) cmdbuf[1] = param; memcpy(&cmdbuf[1], &param, sizeof(param));
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];