2011-09-24 1 views
5

나는 DLL에서 함수를 가지고 :

char __usercall MyUserCallFunction<al>(int arg1<esi>) 

내가/호출을 P를 사용하여 C#을 내에서이 전화를하고 싶습니다 내가 자신을 싫어하기 때문에. 수행하여 호출 후

[UnmanagedFunctionPointer(CallingConvention.ThisCall, CharSet = CharSet.Auto, SetLastError = true)] 
    public delegate char DMyUserCallFunction(IntPtr a1); 

을 그리고 : : 일반적으로이, 라 함수 대리자를 받고하여 수행 할 수 있습니다

var MyFunctionPointer = (DMyUserCallFunction)Marshal.GetDelegateForFunctionPointer(AddressOfFunction, typeof(DMyUserCallFunction)); 

MyFunctionPointer(IntPtr.Zero); 

호출 규칙을 사용자 정의 사용자를 위해, 그러나,이 원인이됩니다 충돌하는 프로그램. 안전하지 않은 코드를 사용하거나 위임자를 배치하는 일종의 래퍼 함수를 ​​사용하여이 작업을 수행 할 수있는 방법이 있나요? C++ DLL을 작성하도록 강요하지 않습니까?

감사합니다.

편집 :

DTB에 의해 제안

, 나는 내가 함수를 호출하는 P/호출을 통해 사용하는 아주 작은 C++ DLL을 만들었습니다. 궁금한 사람을 위해 C++의 함수는 다음과 같이 보입니다.

extern "C" __declspec(dllexport) int __stdcall callUsercallFunction(int functionPointer, int arg1) 
{ 
    int retVal; 

    _asm 
    { 
     mov esi, arg1 
     call functionPointer 
     mov retVal, eax 
    } 

    //Fake returning al, the lower byte of eax 
    return retVal & 0x000000FF; 
} 
+5

+1 "나 자신이 싫어서" – dtb

+0

왜 대리인이 필요합니까? '[DllImport (...)] public extern byte MyUserCallFunction (IntPtr a1)'을 할 수 없습니까? – dtb

+0

함수가 실제로 내보내지지 않습니다. DLL을로드하는 프로세스에 함수를 호출하여 호출해야합니다. 나는 이것을 위해 EasyHook을 사용하고있다. 목표는 DLL 내부에서 IDA를 사용하여 찾을 수있는 임의의 함수를 연결하는 것이다. – mweber

답변

2

C#에서 사용자 정의 호출 규칙을 구현할 의향이 없습니다. 네이티브 DLL 또는 C++/CLI DLL에서이 작업을 수행해야합니다.