server-re/decomp/DBCServer_Release_x64/full/functions/0x1400a63f0.c

323 lines
9.9 KiB
C

/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c
* Ghidra 12.1.2 decompiler output for 0x1400a63f0 FUN_1400a63f0
* Pseudocode, not original source. */
/* WARNING: Function: __security_check_cookie replaced with injection: security_check_cookie */
IID * FUN_1400a63f0(undefined8 *param_1,undefined8 param_2,longlong param_3)
{
uchar *puVar1;
IUnknown *pIVar2;
IUnknown *This;
ULONG UVar3;
int iVar4;
HRESULT HVar5;
undefined8 *puVar6;
undefined8 uVar7;
undefined8 uVar8;
longlong lVar9;
void *_Dst;
IID *riid;
IID *pIVar10;
IID *pIVar11;
undefined1 auStackY_228 [32];
char local_1f8 [4];
uint local_1f4;
IID *local_1f0;
longlong *local_1e8;
LPUNKNOWN local_1e0;
undefined8 local_1d8;
undefined8 *local_1d0;
IUnknown *local_1c8;
longlong *local_1c0;
undefined4 local_1b8;
undefined1 local_1a8 [24];
undefined1 local_190 [24];
undefined4 local_178;
undefined1 *local_170;
undefined4 local_168;
undefined8 local_160;
undefined1 *local_158;
undefined8 local_148;
undefined1 local_140;
undefined8 local_138;
undefined1 local_130;
undefined8 local_128;
undefined1 local_120;
undefined8 local_118;
undefined1 local_110;
undefined1 local_108 [40];
undefined8 local_e0;
IID local_d8 [8];
undefined2 local_56;
ulonglong local_48;
local_e0 = 0xfffffffffffffffe;
local_48 = DAT_1403463c0 ^ (ulonglong)auStackY_228;
pIVar2 = *(IUnknown **)*param_1;
local_1d8 = param_2;
local_1d0 = param_1;
if (pIVar2 == (IUnknown *)0x0) {
LAB_1400a647f:
iVar4 = FUN_1400a80c0(param_1);
if (iVar4 == 0) {
FUN_1400a8040(param_1,param_2,0);
return (IID *)0x0;
}
}
else {
local_1f4 = 0;
UVar3 = (*pIVar2->lpVtbl[0xb].AddRef)(pIVar2);
if ((int)UVar3 < 0) {
_com_issue_errorex(UVar3,pIVar2,(_GUID *)&DAT_14029e018);
}
if (local_1f4 == 0) goto LAB_1400a647f;
}
local_1e8 = (longlong *)0x0;
iVar4 = FUN_140001990(&local_1e8);
if ((iVar4 < 0) && (iVar4 != -0x7fffbffe)) {
/* WARNING: Subroutine does not return */
FUN_140218220(iVar4);
}
local_1c8 = (IUnknown *)0x0;
local_1c0 = (longlong *)0x0;
Ordinal_8(local_1a8);
Ordinal_8(local_190);
pIVar2 = local_1c8;
if ((local_1c8 != (IUnknown *)0x0) && (local_1c8 = (IUnknown *)0x0, pIVar2 != (IUnknown *)0x0)) {
(*pIVar2->lpVtbl->Release)(pIVar2);
}
local_158 = &DAT_14029e010;
local_170 = &DAT_14029e010;
local_168 = 0;
local_160 = 0;
if (local_1c8 != (IUnknown *)0x0) {
(*local_1c8->lpVtbl->Release)(local_1c8);
}
HVar5 = CoCreateInstance((IID *)&DAT_14029e088,(LPUNKNOWN)0x0,0x17,(IID *)&DAT_14029dfb0,
&local_1e0);
if (HVar5 < 0) {
LAB_1400a65a4:
local_1c8 = (IUnknown *)0x0;
}
else {
HVar5 = OleRun(local_1e0);
if (-1 < HVar5) {
HVar5 = (*local_1e0->lpVtbl->QueryInterface)(local_1e0,(IID *)&DAT_14029e078,&local_1c8);
}
(*local_1e0->lpVtbl->Release)(local_1e0);
if (HVar5 < 0) goto LAB_1400a65a4;
}
local_178 = 2;
local_1b8 = 1;
local_1f8[0] = '\x01';
puVar6 = (undefined8 *)FUN_140001f40(*param_1,&local_1f0);
FUN_140001700(&local_1e8,*puVar6,"dbo.up_read_world_server");
if (local_1f0 != (IID *)0x0) {
(**(code **)(*(longlong *)local_1f0 + 0x10))();
}
puVar6 = (undefined8 *)FUN_1400016c0(&local_1e8,&local_1f0);
This = local_1c8;
pIVar2 = (IUnknown *)*puVar6;
if (local_1c8 != pIVar2) {
local_1c8 = pIVar2;
if (pIVar2 != (IUnknown *)0x0) {
(*pIVar2->lpVtbl->AddRef)(pIVar2);
}
if (This != (IUnknown *)0x0) {
(*This->lpVtbl->Release)(This);
}
}
if (local_1f0 != (IID *)0x0) {
(**(code **)(*(longlong *)local_1f0 + 0x10))();
}
pIVar2 = local_1c8;
if (local_1c8 == (IUnknown *)0x0) {
/* WARNING: Subroutine does not return */
FUN_140218220(0x80004003);
}
local_1f4 = local_1f4 & 0xffff0000;
UVar3 = (*local_1c8->lpVtbl[6].Release)(local_1c8);
if ((int)UVar3 < 0) {
_com_issue_errorex(UVar3,pIVar2,(_GUID *)&DAT_14029e038);
}
if ((short)local_1f4 != -1) {
while( true ) {
pIVar2 = local_1c8;
if (local_1c8 == (IUnknown *)0x0) {
/* WARNING: Subroutine does not return */
FUN_140218220(0x80004003);
}
local_1f4 = local_1f4 & 0xffff0000;
UVar3 = (*local_1c8->lpVtbl[6].Release)(local_1c8);
if ((int)UVar3 < 0) {
_com_issue_errorex(UVar3,pIVar2,(_GUID *)&DAT_14029e038);
}
if ((short)local_1f4 == -1) break;
local_d8[0].Data1 = 0;
memset(&local_d8[0].Data2,0,0x80);
uVar7 = FUN_140002290(&local_1c8,local_108,"World",local_1f8);
FUN_140199590(uVar7);
local_d8[0].Data1 = FUN_140063af0(uVar7);
Ordinal_9(local_108);
uVar7 = FUN_140002290(&local_1c8,local_108,&DAT_1402a6218,local_1f8);
FUN_140063de0(uVar7,&local_1f0);
FUN_14016d8c0();
pIVar11 = (IID *)PTR_DAT_1403440a0;
if (PTR_DAT_1403440a0 == (undefined *)0x0) {
pIVar11 = (IID *)0x0;
}
if (local_1f0 != (IID *)PTR_DAT_1403440a0) {
uVar7 = FUN_14016d8c0();
local_140 = 0;
local_148 = uVar7;
FUN_14016db50(uVar7);
local_140 = 1;
if (((pIVar11 != (IID *)0x0) && (pIVar11 != (IID *)PTR_DAT_1403440a0)) &&
(pIVar11[-1].Data4 != (uchar *)0x0)) {
uVar8 = FUN_14016d8c0();
local_110 = 0;
local_118 = uVar8;
FUN_14016db50(uVar8);
local_110 = 1;
puVar1 = pIVar11[-1].Data4 + 4;
*(int *)puVar1 = *(int *)puVar1 + -1;
if (*(int *)puVar1 == 0) {
FUN_14016d970(pIVar11[-1].Data4);
}
FUN_14016dbe0(uVar8);
local_110 = 0;
}
pIVar11 = local_1f0;
if (((local_1f0 != (IID *)PTR_DAT_1403440a0) && (local_1f0 != (IID *)0x0)) &&
(local_1f0 != (IID *)0x8)) {
*(int *)(local_1f0[-1].Data4 + 4) = *(int *)(local_1f0[-1].Data4 + 4) + 1;
}
FUN_14016dbe0(uVar7);
local_140 = 0;
}
riid = pIVar11;
if (pIVar11 == (IID *)0x0) {
riid = (IID *)PTR_DAT_1403440a0;
}
wcsncpy((wchar_t *)&local_d8[0].Data2,(wchar_t *)riid,0x3f);
if (((pIVar11 != (IID *)0x0) && (pIVar11 != (IID *)PTR_DAT_1403440a0)) &&
(pIVar11[-1].Data4 != (uchar *)0x0)) {
uVar7 = FUN_14016d8c0();
local_130 = 0;
local_138 = uVar7;
FUN_14016db50(uVar7);
local_130 = 1;
puVar1 = pIVar11[-1].Data4 + 4;
*(int *)puVar1 = *(int *)puVar1 + -1;
if (*(int *)puVar1 == 0) {
FUN_14016d970(pIVar11[-1].Data4);
}
FUN_14016dbe0(uVar7);
local_130 = 0;
}
pIVar11 = local_1f0;
if (((local_1f0 != (IID *)0x0) && (local_1f0 != (IID *)PTR_DAT_1403440a0)) &&
(pIVar10 = local_1f0 + -1, pIVar10->Data4 != (uchar *)0x0)) {
uVar7 = FUN_14016d8c0();
local_120 = 0;
local_128 = uVar7;
FUN_14016db50(uVar7);
local_120 = 1;
puVar1 = pIVar11[-1].Data4 + 4;
*(int *)puVar1 = *(int *)puVar1 + -1;
if (*(int *)puVar1 == 0) {
FUN_14016d970(pIVar10->Data4);
}
FUN_14016dbe0(uVar7);
local_120 = 0;
}
local_1f0 = (IID *)PTR_DAT_1403440a0;
Ordinal_9(local_108);
local_56 = 0;
pIVar11 = *(IID **)(param_3 + 0x16);
if ((local_d8 < pIVar11) && (*(IID **)(param_3 + 0xe) <= local_d8)) {
lVar9 = (longlong)local_d8 - (longlong)*(IID **)(param_3 + 0xe);
riid = SUB168(SEXT816(0xf83e0f83e0f83e1) * SEXT816(lVar9),8);
if (pIVar11 == *(IID **)(param_3 + 0x1e)) {
FUN_140049a40(param_3 + 0xe);
}
pIVar10 = (IID *)((lVar9 / 0x84) * 0x84 + *(longlong *)(param_3 + 0xe));
_Dst = *(void **)(param_3 + 0x16);
if (_Dst != (void *)0x0) {
LAB_1400a69f3:
pIVar11 = (IID *)0x84;
memcpy(_Dst,pIVar10,0x84);
riid = pIVar10;
}
}
else {
if (pIVar11 == *(IID **)(param_3 + 0x1e)) {
FUN_140049a40(param_3 + 0xe);
}
_Dst = *(void **)(param_3 + 0x16);
if (_Dst != (void *)0x0) {
pIVar10 = local_d8;
goto LAB_1400a69f3;
}
}
pIVar2 = local_1c8;
*(longlong *)(param_3 + 0x16) = *(longlong *)(param_3 + 0x16) + 0x84;
if (local_1c8 == (IUnknown *)0x0) {
/* WARNING: Subroutine does not return */
FUN_140218220(0x80004003);
}
HVar5 = (*local_1c8->lpVtbl[0xc].QueryInterface)(local_1c8,riid,(void **)pIVar11);
if (HVar5 < 0) {
_com_issue_errorex(HVar5,pIVar2,(_GUID *)&DAT_14029e038);
}
}
pIVar11 = (IID *)0x1;
if (local_1f8[0] != '\0') goto LAB_1400a6a53;
}
*(undefined2 *)(param_3 + 0xc) = 0;
pIVar11 = (IID *)0x0;
LAB_1400a6a53:
pIVar2 = local_1c8;
if (local_1c8 != (IUnknown *)0x0) {
local_1f4 = 0;
UVar3 = (*local_1c8->lpVtbl[0x12].AddRef)(local_1c8);
if ((int)UVar3 < 0) {
_com_issue_errorex(UVar3,pIVar2,(_GUID *)&DAT_14029e038);
}
pIVar2 = local_1c8;
if (local_1f4 != 0) {
if (local_1c8 == (IUnknown *)0x0) {
/* WARNING: Subroutine does not return */
FUN_140218220(0x80004003);
}
UVar3 = (*local_1c8->lpVtbl[10].Release)(local_1c8);
if ((int)UVar3 < 0) {
_com_issue_errorex(UVar3,pIVar2,(_GUID *)&DAT_14029e038);
}
}
if (local_1c8 != (IUnknown *)0x0) {
(*local_1c8->lpVtbl->Release)(local_1c8);
local_1c8 = (IUnknown *)0x0;
}
}
local_160 = 0;
local_158 = &DAT_14029e010;
local_170 = &DAT_14029e010;
local_168 = 0;
local_178 = 0;
Ordinal_9(local_190);
Ordinal_9(local_1a8);
if (local_1c0 != (longlong *)0x0) {
(**(code **)(*local_1c0 + 0x10))();
}
if (local_1c8 != (IUnknown *)0x0) {
(*local_1c8->lpVtbl->Release)(local_1c8);
}
if (local_1e8 != (longlong *)0x0) {
(**(code **)(*local_1e8 + 0x10))();
}
return pIVar11;
}