コード例 #1
0
ファイル: minisoc.c プロジェクト: TemplarsCreed/Luma3DS
Result miniSocInit()
{
    if(AtomicPostIncrement(&miniSocRefCount))
        return 0;

    u32 tmp = 0;
    Result ret = 0;
    bool isSocURegistered;

    ret = srvIsServiceRegistered(&isSocURegistered, "soc:U");
    if(ret != 0) goto cleanup;
    if(!isSocURegistered)
    {
        ret = -1;
        goto cleanup;
    }

    ret = srvGetServiceHandle(&SOCU_handle, "soc:U");
    if(ret != 0) goto cleanup;

    ret = svcControlMemory(&tmp, socContextAddr, 0, socContextSize, MEMOP_ALLOC, MEMPERM_READ | MEMPERM_WRITE);
    if(ret != 0) goto cleanup;

    socContextAddr = tmp;

    ret = svcCreateMemoryBlock(&socMemhandle, (u32)socContextAddr, socContextSize, 0, 3);
    if(ret != 0) goto cleanup;



    ret = SOCU_Initialize(socMemhandle, socContextSize);
    if(ret != 0) goto cleanup;

    svcKernelSetState(0x10000, 2);
    miniSocEnabled = true;
    return 0;

cleanup:
    AtomicDecrement(&miniSocRefCount);

    if(socMemhandle != 0)
    {
        svcCloseHandle(socMemhandle);
        socMemhandle = 0;
    }

    if(SOCU_handle != 0)
    {
        SOCU_Shutdown();
        svcCloseHandle(SOCU_handle);
        SOCU_handle = 0;
    }

    if(tmp != 0)
        svcControlMemory(&tmp, socContextAddr, socContextAddr, socContextSize, MEMOP_FREE, MEMPERM_DONTCARE);

    return ret;
}
コード例 #2
0
ファイル: sslc.c プロジェクト: Bownairo/ctrulib
Result sslcContextInitSharedmem(sslcContext *context, u8 *buf, u32 size)
{
	Result ret=0;

	ret = svcCreateMemoryBlock(&context->sharedmem_handle, (u32)buf, size, 1, 3);
	if(R_FAILED(ret))return ret;

	ret = sslcipc_ContextInitSharedmem(context, size);

	if(R_FAILED(ret))
	{
		svcCloseHandle(context->sharedmem_handle);
		context->sharedmem_handle = 0;
	}

	return ret;
}
コード例 #3
0
ファイル: uds.c プロジェクト: Caboosium/ctrulib
static Result uds_Initialize(u32 sharedmem_size, const char *username)
{
	Result ret=0;
	udsNodeInfo nodeinfo;

	ret = udsGenerateNodeInfo(&nodeinfo, username);
	if (R_FAILED(ret))return ret;

	__uds_sharedmem_size = sharedmem_size;
	__uds_sharedmem_handle = 0;

	__uds_sharedmem_addr = memalign(0x1000, __uds_sharedmem_size);
	if(__uds_sharedmem_addr==NULL)ret = -1;

	if (R_SUCCEEDED(ret))
	{
		memset(__uds_sharedmem_addr, 0, __uds_sharedmem_size);
		ret = svcCreateMemoryBlock(&__uds_sharedmem_handle, (u32)__uds_sharedmem_addr, __uds_sharedmem_size, 0x0, MEMPERM_READ | MEMPERM_WRITE);
	}

	if (R_SUCCEEDED(ret))ret = udsipc_InitializeWithVersion(&nodeinfo, __uds_sharedmem_handle, __uds_sharedmem_size, &__uds_connectionstatus_event);

	if (R_FAILED(ret) && __uds_sharedmem_handle)
	{
		svcCloseHandle(__uds_sharedmem_handle);
		__uds_sharedmem_handle = 0;
		__uds_sharedmem_size = 0;
	}

	if(R_FAILED(ret) && __uds_sharedmem_addr)
	{
		free(__uds_sharedmem_addr);
		__uds_sharedmem_addr = NULL;
	}

	if(R_FAILED(ret) && __uds_connectionstatus_event)
	{
		svcCloseHandle(__uds_connectionstatus_event);
		__uds_connectionstatus_event = 0;
	}

	return ret;
}
コード例 #4
0
ファイル: soc_init.c プロジェクト: vtsingaras/ctrulib
Result socInit(u32* context_addr, u32 context_size)
{
	Result ret = 0;

	/* check that the "soc" device doesn't already exist */
	int dev = FindDevice("soc:");
	if(dev >= 0)
		return -1;

	ret = svcCreateMemoryBlock(&socMemhandle, (u32)context_addr, context_size, 0, 3);
	if(ret != 0) return ret;

	ret = srvGetServiceHandle(&SOCU_handle, "soc:U");
	if(ret != 0)
	{
		svcCloseHandle(socMemhandle);
		socMemhandle = 0;
		return ret;
	}

	ret = SOCU_Initialize(socMemhandle, context_size);
	if(ret != 0)
	{
		svcCloseHandle(socMemhandle);
		svcCloseHandle(SOCU_handle);
		socMemhandle = 0;
		SOCU_handle = 0;
		return ret;
	}

	/* add the "soc" device */
	dev = AddDevice(&soc_devoptab);
	if(dev < 0)
	{
		svcCloseHandle(socMemhandle);
		svcCloseHandle(SOCU_handle);
		socMemhandle = 0;
		SOCU_handle = 0;
		return dev;
	}

	return 0;
}
コード例 #5
0
ファイル: ir.c プロジェクト: Almamu/ctrulib
Result IRU_Initialize(u32 *sharedmem_addr, u32 sharedmem_size)
{
	Result ret = 0;

	if(iru_handle)return 0;

	ret = srvGetServiceHandle(&iru_handle, "ir:u");
	if(ret!=0)return ret;

	ret = irucmd_Initialize();
	if(ret!=0)return ret;

	ret = svcCreateMemoryBlock(&iru_sharedmem_handle, (u32)sharedmem_addr, sharedmem_size, 1, 3);
	if(ret!=0)return ret;

	iru_sharedmem = sharedmem_addr;
	iru_sharedmem_size = sharedmem_size;

	return ret;
}
コード例 #6
0
ファイル: main.c プロジェクト: smealum/ctrrpc
int execute_cmd(int sock, cmd_t* cmd) {
    memset(&resp, 0, sizeof(resp));

    resp.numarg=7;

    switch(cmd->type) {
    case 0: // exit
        return 0xDEAD;

    case 1: { // read u32
        u32* p = (u32*) cmd->args[0];
        resp.args[0] = *p;
        break;
    }

    case 2: { // write u32
        u32* p = (u32*) cmd->args[0];
        *p = cmd->args[1];
        break;
    }

    case 3: { // get tls
        resp.args[0] = (u32) getThreadCommandBuffer();
        break;
    }

    case 4: { // querymem
        MemInfo info;
        PageInfo flags;
        memset(&info, 0, sizeof(info));
        memset(&flags, 0, sizeof(flags));

        int ret = svcQueryMemory(&info, &flags, cmd->args[0]);
        resp.args[0] = ret;
        resp.args[1] = info.base_addr;
        resp.args[2] = info.size;
        resp.args[3] = info.perm;
        resp.args[4] = info.state;
        resp.args[5] = flags.flags;
        break;
    }

    case 5: { // creatememblock
        u32 handle = 0;
        int ret = svcCreateMemoryBlock(&handle, cmd->args[0],
            cmd->args[1], cmd->args[2], cmd->args[3]);

        resp.args[0] = ret;
        resp.args[1] = handle;
        break;
    }

    case 6: { // controlmem
        u32 outaddr = 0;
        int ret = svcControlMemory(&outaddr, cmd->args[0], cmd->args[1],
            cmd->args[2], cmd->args[3], cmd->args[4]);

        resp.args[0] = ret;
        resp.args[1] = outaddr;
        break;
    }

    case 7: { // getservicehandle
        Handle handle = 0;
        int ret = srvGetServiceHandle(&handle, (const char*) &cmd->args[0]);

        resp.args[0] = ret;
        resp.args[1] = handle;
        break;
    }

    case 8: { // syncrequest
        int ret = svcSendSyncRequest(cmd->args[0]);

        resp.args[0] = ret;
        break;
    }

    case 9: { // closehandle
        int ret = svcCloseHandle(cmd->args[0]);

        resp.args[0] = ret;
        break;
    }

    case 10: { // getctrulibhandle
        switch(cmd->args[0]) {

        case 0: { // gsp_handle
            extern Handle gspGpuHandle;
            resp.args[0] = gspGpuHandle;
            break;
        }
        }

        break;
    }

    case 11: { // malloc/free
        char* p = NULL;

        switch(cmd->args[0]) {
        case 0: { // normal-mem
            p = malloc(0x100);
            break;
        }

        case 1: { // linear-mem
            p = linearAlloc(0x100);
            break;
        }

        case 2: { // free normal-mem
            free((void*)cmd->args[1]);
            break;
        }

        case 3: { // free linear-mem
            linearFree((void*)cmd->args[1]);
            break;
        }
        }

        resp.args[0] = (u32) p;
        break;
    }

    case 12: { // enable/disable drawing
        enable_draw = cmd->args[0];
        break;
    }

    default:
        return 0xDEAD; // unknown cmd
    }

    return 0;
}
コード例 #7
0
ファイル: swkbd.c プロジェクト: Caboosium/ctrulib
SwkbdButton swkbdInputText(SwkbdState* swkbd, char* buf, size_t bufsize)
{
	SwkbdExtra extra = swkbd->extra; // Struct copy

	// Calculate sharedmem size
	size_t sharedMemSize = 0;
	sharedMemSize += (sizeof(u16)*(swkbd->max_text_len+1) + 3) &~ 3;
	size_t dictOff = sharedMemSize;
	sharedMemSize += (sizeof(SwkbdDictWord)*swkbd->dict_word_count + 3) &~ 3;
	size_t statusOff = sharedMemSize;
	sharedMemSize += swkbd->initial_status_offset >= 0 ? sizeof(SwkbdStatusData) : 0;
	size_t learningOff = sharedMemSize;
	sharedMemSize += swkbd->initial_learning_offset >= 0 ? sizeof(SwkbdLearningData) : 0;
	if (swkbd->save_state_flags & BIT(0))
	{
		swkbd->status_offset = sharedMemSize;
		sharedMemSize += sizeof(SwkbdStatusData);
	}
	if (swkbd->save_state_flags & BIT(1))
	{
		swkbd->learning_offset = sharedMemSize;
		sharedMemSize += sizeof(SwkbdLearningData);
	}
	sharedMemSize  = (sharedMemSize + 0xFFF) &~ 0xFFF;
	swkbd->shared_memory_size = sharedMemSize;

	// Allocate sharedmem
	swkbdSharedMem = (char*)memalign(0x1000, sharedMemSize);
	if (!swkbdSharedMem)
	{
		swkbd->result = SWKBD_OUTOFMEM;
		return SWKBD_BUTTON_NONE;
	}

	// Create sharedmem block
	Result res = svcCreateMemoryBlock(&swkbdSharedMemHandle, (u32)swkbdSharedMem, sharedMemSize, MEMPERM_READ|MEMPERM_WRITE, MEMPERM_READ|MEMPERM_WRITE);
	if (R_FAILED(res))
	{
		free(swkbdSharedMem);
		swkbd->result = SWKBD_OUTOFMEM;
		return SWKBD_BUTTON_NONE;
	}

	// Copy stuff to shared mem
	if (extra.initial_text)
	{
		swkbd->initial_text_offset = 0;
		swkbdConvertToUTF16((u16*)swkbdSharedMem, extra.initial_text, swkbd->max_text_len);
	}
	if (extra.dict)
	{
		swkbd->dict_offset = dictOff;
		memcpy(swkbdSharedMem+dictOff, extra.dict, sizeof(SwkbdDictWord)*swkbd->dict_word_count);
	}
	if (swkbd->initial_status_offset >= 0)
	{
		swkbd->initial_status_offset = statusOff;
		memcpy(swkbdSharedMem+statusOff, extra.status_data, sizeof(SwkbdStatusData));
	}
	if (swkbd->initial_learning_offset >= 0)
	{
		swkbd->initial_learning_offset = learningOff;
		memcpy(swkbdSharedMem+learningOff, extra.learning_data, sizeof(SwkbdLearningData));
	}

	if (extra.callback) swkbd->filter_flags |= SWKBD_FILTER_CALLBACK;
	else                swkbd->filter_flags &= ~SWKBD_FILTER_CALLBACK;

	// Launch swkbd
	memset(swkbd->reserved, 0, sizeof(swkbd->reserved));
	if (extra.callback) aptSetMessageCallback(swkbdMessageCallback, &extra);
	bool ret = aptLaunchLibraryApplet(APPID_SOFTWARE_KEYBOARD, swkbd, sizeof(*swkbd), swkbdSharedMemHandle);
	if (extra.callback) aptSetMessageCallback(NULL, NULL);
	svcCloseHandle(swkbdSharedMemHandle);

	SwkbdButton button = SWKBD_BUTTON_NONE;

	if (ret)
	{
		u16* text16 = (u16*)(swkbdSharedMem+swkbd->text_offset);
		text16[swkbd->text_length] = 0;
		swkbdConvertToUTF8(buf, text16, bufsize-1);
		if (swkbd->save_state_flags & BIT(0)) memcpy(extra.status_data, swkbdSharedMem+swkbd->status_offset, sizeof(SwkbdStatusData));
		if (swkbd->save_state_flags & BIT(1)) memcpy(extra.learning_data, swkbdSharedMem+swkbd->learning_offset, sizeof(SwkbdLearningData));

		switch (swkbd->result)
		{
			case SWKBD_D1_CLICK0:
			case SWKBD_D2_CLICK0:
				button = SWKBD_BUTTON_LEFT;
				break;
			case SWKBD_D2_CLICK1:
				button = SWKBD_BUTTON_MIDDLE;
				break;
			case SWKBD_D0_CLICK:
			case SWKBD_D1_CLICK1:
			case SWKBD_D2_CLICK2:
				button = SWKBD_BUTTON_RIGHT;
				break;
			default:
				break;
		}
	}

	free(swkbdSharedMem);
	return button;
}