-
-
Notifications
You must be signed in to change notification settings - Fork 429
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Dhooks] Add the ability to work with the this parameter, which is an object #2219
base: master
Are you sure you want to change the base?
Changes from 4 commits
2d008c1
a262653
9c07ebe
358eef1
945499b
88024a7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1096,20 +1096,45 @@ cell_t Native_GetParamObjectPtrVar(IPluginContext *pContext, const cell_t *param | |
return 0; | ||
} | ||
|
||
if(params[2] <= 0 || params[2] > (int)paramStruct->dg->params.size()) | ||
void *addr = NULL; | ||
|
||
if(params[2] != 0) | ||
{ | ||
return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.size()); | ||
} | ||
if(params[2] < 0 || params[2] > (int)paramStruct->dg->params.size()) | ||
{ | ||
return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.size()); | ||
} | ||
|
||
int index = params[2] - 1; | ||
int index = params[2] - 1; | ||
|
||
if(paramStruct->dg->params.at(index).type != HookParamType_ObjectPtr && paramStruct->dg->params.at(index).type != HookParamType_Object) | ||
{ | ||
return pContext->ThrowNativeError("Invalid object value type %i", paramStruct->dg->params.at(index).type); | ||
if(paramStruct->dg->params.at(index).type != HookParamType_ObjectPtr && paramStruct->dg->params.at(index).type != HookParamType_Object) | ||
{ | ||
return pContext->ThrowNativeError("Invalid object value type %i", paramStruct->dg->params.at(index).type); | ||
} | ||
|
||
size_t offset = GetParamOffset(paramStruct, index); | ||
addr = GetObjectAddr(paramStruct->dg->params.at(index).type, paramStruct->dg->params.at(index).flags, paramStruct->orgParams, offset); | ||
} | ||
else | ||
{ | ||
/*HookSetup* setup; | ||
if(!GetHandleIfValidOrError(g_HookSetupHandle, (void **)&setup, pContext, params[1])) | ||
{ | ||
return pContext->ThrowNativeError("Cannot determine calling convention type, parameter 'this' is only available in member functions"); | ||
} | ||
|
||
size_t offset = GetParamOffset(paramStruct, index); | ||
void *addr = GetObjectAddr(paramStruct->dg->params.at(index).type, paramStruct->dg->params.at(index).flags, paramStruct->orgParams, offset); | ||
if(setup->callConv != CallConv_THISCALL) | ||
{ | ||
return pContext->ThrowNativeError("Parameter 'this' is only available in member functions, specify the calling convention type 'thiscall'"); | ||
}*/ | ||
|
||
if(paramStruct->dg->thisType != ThisPointer_Address) | ||
{ | ||
return pContext->ThrowNativeError("Parameter 'this' is not specified as an address, it is not available"); | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That check should be removed, |
||
|
||
addr = g_SHPtr->GetIfacePtr(); | ||
} | ||
|
||
switch((ObjectValueType)params[4]) | ||
{ | ||
|
@@ -1167,20 +1192,45 @@ cell_t Native_SetParamObjectPtrVar(IPluginContext *pContext, const cell_t *param | |
return 0; | ||
} | ||
|
||
if(params[2] <= 0 || params[2] > (int)paramStruct->dg->params.size()) | ||
void *addr = NULL; | ||
|
||
if(params[2] != 0) | ||
{ | ||
return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.size()); | ||
} | ||
if(params[2] < 0 || params[2] > (int)paramStruct->dg->params.size()) | ||
{ | ||
return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.size()); | ||
} | ||
|
||
int index = params[2] - 1; | ||
int index = params[2] - 1; | ||
|
||
if(paramStruct->dg->params.at(index).type != HookParamType_ObjectPtr && paramStruct->dg->params.at(index).type != HookParamType_Object) | ||
{ | ||
return pContext->ThrowNativeError("Invalid object value type %i", paramStruct->dg->params.at(index).type); | ||
} | ||
|
||
if(paramStruct->dg->params.at(index).type != HookParamType_ObjectPtr && paramStruct->dg->params.at(index).type != HookParamType_Object) | ||
size_t offset = GetParamOffset(paramStruct, index); | ||
addr = GetObjectAddr(paramStruct->dg->params.at(index).type, paramStruct->dg->params.at(index).flags, paramStruct->orgParams, offset); | ||
} | ||
else | ||
{ | ||
return pContext->ThrowNativeError("Invalid object value type %i", paramStruct->dg->params.at(index).type); | ||
/*HookSetup* setup; | ||
if(!GetHandleIfValidOrError(g_HookSetupHandle, (void **)&setup, pContext, params[1])) | ||
{ | ||
return pContext->ThrowNativeError("Cannot determine calling convention type, parameter 'this' is only available in member functions"); | ||
} | ||
|
||
if(setup->callConv != CallConv_THISCALL) | ||
{ | ||
return pContext->ThrowNativeError("Parameter 'this' is only available in member functions, specify the calling convention type 'thiscall'"); | ||
}*/ | ||
|
||
if(paramStruct->dg->thisType != ThisPointer_Address) | ||
{ | ||
return pContext->ThrowNativeError("Parameter 'this' is not specified as an address, it is not available"); | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ditto |
||
|
||
addr = g_SHPtr->GetIfacePtr(); | ||
} | ||
|
||
size_t offset = GetParamOffset(paramStruct, index); | ||
void *addr = GetObjectAddr(paramStruct->dg->params.at(index).type, paramStruct->dg->params.at(index).flags, paramStruct->orgParams, offset); | ||
|
||
switch((ObjectValueType)params[4]) | ||
{ | ||
|
@@ -1252,20 +1302,45 @@ cell_t Native_GetParamObjectPtrVarVector(IPluginContext *pContext, const cell_t | |
return 0; | ||
} | ||
|
||
if(params[2] <= 0 || params[2] > (int)paramStruct->dg->params.size()) | ||
void *addr = NULL; | ||
|
||
if(params[2] != 0) | ||
{ | ||
return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.size()); | ||
} | ||
if(params[2] < 0 || params[2] > (int)paramStruct->dg->params.size()) | ||
{ | ||
return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.size()); | ||
} | ||
|
||
int index = params[2] - 1; | ||
int index = params[2] - 1; | ||
|
||
if(paramStruct->dg->params.at(index).type != HookParamType_ObjectPtr && paramStruct->dg->params.at(index).type != HookParamType_Object) | ||
{ | ||
return pContext->ThrowNativeError("Invalid object value type %i", paramStruct->dg->params.at(index).type); | ||
if(paramStruct->dg->params.at(index).type != HookParamType_ObjectPtr && paramStruct->dg->params.at(index).type != HookParamType_Object) | ||
{ | ||
return pContext->ThrowNativeError("Invalid object value type %i", paramStruct->dg->params.at(index).type); | ||
} | ||
|
||
size_t offset = GetParamOffset(paramStruct, index); | ||
addr = GetObjectAddr(paramStruct->dg->params.at(index).type, paramStruct->dg->params.at(index).flags, paramStruct->orgParams, offset); | ||
} | ||
else | ||
{ | ||
/*HookSetup* setup; | ||
if(!GetHandleIfValidOrError(g_HookSetupHandle, (void **)&setup, pContext, params[1])) | ||
{ | ||
return pContext->ThrowNativeError("Cannot determine calling convention type, parameter 'this' is only available in member functions"); | ||
} | ||
|
||
size_t offset = GetParamOffset(paramStruct, index); | ||
void *addr = GetObjectAddr(paramStruct->dg->params.at(index).type, paramStruct->dg->params.at(index).flags, paramStruct->orgParams, offset); | ||
if(setup->callConv != CallConv_THISCALL) | ||
{ | ||
return pContext->ThrowNativeError("Parameter 'this' is only available in member functions, specify the calling convention type 'thiscall'"); | ||
}*/ | ||
|
||
if(paramStruct->dg->thisType != ThisPointer_Address) | ||
{ | ||
return pContext->ThrowNativeError("Parameter 'this' is not specified as an address, it is not available"); | ||
} | ||
|
||
addr = g_SHPtr->GetIfacePtr(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ditto |
||
} | ||
|
||
cell_t *buffer; | ||
pContext->LocalToPhysAddr(params[5], &buffer); | ||
|
@@ -1305,21 +1380,46 @@ cell_t Native_SetParamObjectPtrVarVector(IPluginContext *pContext, const cell_t | |
{ | ||
return 0; | ||
} | ||
|
||
void *addr = NULL; | ||
|
||
if(params[2] <= 0 || params[2] > (int)paramStruct->dg->params.size()) | ||
if(params[2] != 0) | ||
{ | ||
return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.size()); | ||
} | ||
if(params[2] < 0 || params[2] > (int)paramStruct->dg->params.size()) | ||
{ | ||
return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.size()); | ||
} | ||
|
||
int index = params[2] - 1; | ||
int index = params[2] - 1; | ||
|
||
if(paramStruct->dg->params.at(index).type != HookParamType_ObjectPtr && paramStruct->dg->params.at(index).type != HookParamType_Object) | ||
{ | ||
return pContext->ThrowNativeError("Invalid object value type %i", paramStruct->dg->params.at(index).type); | ||
if(paramStruct->dg->params.at(index).type != HookParamType_ObjectPtr && paramStruct->dg->params.at(index).type != HookParamType_Object) | ||
{ | ||
return pContext->ThrowNativeError("Invalid object value type %i", paramStruct->dg->params.at(index).type); | ||
} | ||
|
||
size_t offset = GetParamOffset(paramStruct, index); | ||
addr = GetObjectAddr(paramStruct->dg->params.at(index).type, paramStruct->dg->params.at(index).flags, paramStruct->orgParams, offset); | ||
} | ||
else | ||
{ | ||
/*HookSetup* setup; | ||
if(!GetHandleIfValidOrError(g_HookSetupHandle, (void **)&setup, pContext, params[1])) | ||
{ | ||
return pContext->ThrowNativeError("Cannot determine calling convention type, parameter 'this' is only available in member functions"); | ||
} | ||
|
||
size_t offset = GetParamOffset(paramStruct, index); | ||
void *addr = GetObjectAddr(paramStruct->dg->params.at(index).type, paramStruct->dg->params.at(index).flags, paramStruct->orgParams, offset); | ||
if(setup->callConv != CallConv_THISCALL) | ||
{ | ||
return pContext->ThrowNativeError("Parameter 'this' is only available in member functions, specify the calling convention type 'thiscall'"); | ||
}*/ | ||
|
||
if(paramStruct->dg->thisType != ThisPointer_Address) | ||
{ | ||
return pContext->ThrowNativeError("Parameter 'this' is not specified as an address, it is not available"); | ||
} | ||
|
||
addr = g_SHPtr->GetIfacePtr(); | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ditto |
||
|
||
cell_t *buffer; | ||
pContext->LocalToPhysAddr(params[5], &buffer); | ||
|
@@ -1346,6 +1446,7 @@ cell_t Native_SetParamObjectPtrVarVector(IPluginContext *pContext, const cell_t | |
vec->z = sp_ctof(buffer[2]); | ||
return 1; | ||
} | ||
|
||
A1mDev marked this conversation as resolved.
Show resolved
Hide resolved
|
||
return pContext->ThrowNativeError("Invalid Object value type (not a type of vector)"); | ||
} | ||
|
||
|
@@ -1359,20 +1460,45 @@ cell_t Native_GetParamObjectPtrString(IPluginContext *pContext, const cell_t *pa | |
return 0; | ||
} | ||
|
||
if(params[2] <= 0 || params[2] > (int)paramStruct->dg->params.size()) | ||
void *addr = NULL; | ||
|
||
if(params[2] != 0) | ||
{ | ||
return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.size()); | ||
} | ||
if(params[2] <= 0 || params[2] > (int)paramStruct->dg->params.size()) | ||
{ | ||
return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.size()); | ||
} | ||
|
||
int index = params[2] - 1; | ||
int index = params[2] - 1; | ||
|
||
if(paramStruct->dg->params.at(index).type != HookParamType_ObjectPtr && paramStruct->dg->params.at(index).type != HookParamType_Object) | ||
{ | ||
return pContext->ThrowNativeError("Invalid object value type %i", paramStruct->dg->params.at(index).type); | ||
if(paramStruct->dg->params.at(index).type != HookParamType_ObjectPtr && paramStruct->dg->params.at(index).type != HookParamType_Object) | ||
{ | ||
return pContext->ThrowNativeError("Invalid object value type %i", paramStruct->dg->params.at(index).type); | ||
} | ||
|
||
size_t offset = GetParamOffset(paramStruct, index); | ||
addr = GetObjectAddr(paramStruct->dg->params.at(index).type, paramStruct->dg->params.at(index).flags, paramStruct->orgParams, offset); | ||
} | ||
else | ||
{ | ||
/*HookSetup* setup; | ||
if(!GetHandleIfValidOrError(g_HookSetupHandle, (void **)&setup, pContext, params[1])) | ||
{ | ||
return pContext->ThrowNativeError("Cannot determine calling convention type, parameter 'this' is only available in member functions"); | ||
} | ||
|
||
size_t offset = GetParamOffset(paramStruct, index); | ||
void *addr = GetObjectAddr(paramStruct->dg->params.at(index).type, paramStruct->dg->params.at(index).flags, paramStruct->orgParams, offset); | ||
if(setup->callConv != CallConv_THISCALL) | ||
{ | ||
return pContext->ThrowNativeError("Parameter 'this' is only available in member functions, specify the calling convention type 'thiscall'"); | ||
}*/ | ||
|
||
if(paramStruct->dg->thisType != ThisPointer_Address) | ||
{ | ||
return pContext->ThrowNativeError("Parameter 'this' is not specified as an address, it is not available"); | ||
} | ||
|
||
addr = g_SHPtr->GetIfacePtr(); | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ditto |
||
|
||
switch((ObjectValueType)params[4]) | ||
{ | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That check is fine, you should enable it!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This code doesn't work for some reason
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh yeah we need to pass Handle as the first parameter but we don't so this code doesn't work
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't know how to get handle in existing code, I'll have to save it somewhere, or use such code to work with the "this" parameter:
int iParent = DHookGetParamObjectPtrVar(hParams, 0, 384, ObjectValueType_Ehandle, g_hDetour);