2013-08-16 5 views
0

관리되지 않는 함수를 호출하려고합니다. 나는에 의해 C++에서라고했습니다 이 날BYTE * C#의 배열

// ConsoleApplication5.cpp : main project file. 

#include "stdafx.h" 
#include <windows.h> 
#include <stdio.h> 
#include <string> 

using namespace System; 

typedef int(*Funcs)(int, BYTE (*)[90], BYTE (*)[90]); 

int main(array<System::String ^> ^args) 
{ 
BYTE Input[] = 
     { 
        0x7f,0x06,0x02,0x66,0xd2,0x3e,0x4c,0x7f,0x50,0x0a,0x5a,0x3c,0xab,0x43,0x5d,0x51,0x47,0xe5,0 x94,0x49,0xbd,0xef,0xc2,0xe4 
,0x6c,0xb1,0x3b,0x3d,0x7c,0x47,0x65,0x8f,0x67,0xa6,0xe8,0x6a,0xe9,0x0e,0xbd,0x93,0xad,0x4a, 0x31,0x68,0x82,0x02,0xe6,0x7e,0x01,0x36,0xa, 
9,0x75,0xf7,0xa0,0xb9,0xe9,0x1b,0x09,0xba,0x19,0x8c,0x97,0x18,0x9c,0xcc,0xd8,0x87,0x0e,0x04 ,0xb3,0x7c,0xc2,0xbf,0x1e,0x42,0x3e,0x8b,0x64,0xf5,0x60,0x43,0x96,0xe7,0xf6,0x7d,0x54,0x84, 0x54,0x00 
     }; 
      BYTE OutPut[90]; 
Funcs Funcis; 
HMODULE x = LoadLibrary(L"E:\\Games\\Silkroad\\HackShield\\ehsvc.dll"); 
Funcis = (Funcs)GetProcAddress(x,"16"); 
Funcis(13,&Input,&OutPut); 

FILE * pFile; 
pFile = fopen ("myfile.bin", "wb"); 
fwrite (OutPut , sizeof(char), sizeof(OutPut), pFile); 
fclose (pFile); 

Console::Read(); 
} 

을하지만 난으로 C#에서 호출 할 때 작업 테스트 프로젝트입니다 :

delegate int GetResponseD(int Code, byte[] Input, byte[] OutPut); 
... 
IntPtr hModule = LoadLibrary(@"###.dll"); 
IntPtr hFunc = GetProcAddress(hModule, "10"); 
GetResponseD Get = (GetResponseD)Marshal.GetDelegateForFunctionPointer(hFunc, typeof(GetResponseD)); 
GetResponse(13, Input, OutPut); 

내가 첫 번째 바이트를 얻을에만

+0

위임자의 매개 변수에 적절한'MarshaAs' 속성을 사용해 보셨습니까? – Corey

+0

누가 C에서 두 개의 배열을 할당합니까? 발신자? – xanatos

+0

Not Working Sorry – user2529018

답변

0

뭔가 비슷한, 배열은 DLL의 방법으로 할당하는 경우 :

// You will probably have to free in some way Input and Output 
delegate int GetResponseD(int Code, ref IntPtr Input, ref IntPtr OutPut); 

static void Main() 
{ 
    IntPtr input = IntPtr.Zero, output = IntPtr.Zero; 
    GetResponseD grd = null; // something 

    int res = grd(1, out input, out output); 

    var input2 = new byte[90]; 
    var output2 = new byte[90]; 

    Marshal.Copy(input, input2, 0, input2.Length); 
    Marshal.Copy(output, output2, 0, output2.Length); 

    // Remember that you have to free input and output! 
} 

C에서 # 관리되지 않는 배열은 사용할 수 없습니다. 당신은 다른 호출 모드 시도에 대한

(충분히 당신이 필요로하는 것에 대해 전적으로 사실,하지만 사실이 아니다) 관리 배열에 데이터를 복사 할 수 있습니다

delegate int GetResponseD(int Code, ref IntPtr Input, ref IntPtr OutPut); 

byte[] input = new byte[] { 
    0x7f,0x06,0x02,0x66,0xd2,0x3e,0x4c,0x7f,0x50,0x0a,0x5a,0x3c,0xab,0x43,0x5d,0x51,0x47,0xe5,0x94,0x49,0xbd,0xef,0xc2,0xe4,0x6c,0xb1,0x3b,0x3d,0x7c,0x47,0x65,0x8f,0x67,0xa6,0xe8,0x6a,0xe9,0x0e,0xbd,0x93,0xad,0x4a,0x31,0x68,0x82,0x02,0xe6,0x7e,0x01,0x36,0xa,9,0x75,0xf7,0xa0,0xb9,0xe9,0x1b,0x09,0xba,0x19,0x8c,0x97,0x18,0x9c,0xcc,0xd8,0x87,0x0e,0x04,0xb3,0x7c,0xc2,0xbf,0x1e,0x42,0x3e,0x8b,0x64,0xf5,0x60,0x43,0x96,0xe7,0xf6,0x7d,0x54,0x84,0x54,0x00 
}; 

byte[] output = new byte[90]; 

GetResponseD grd = null; // something 

GCHandle h1 = GCHandle.Alloc(input, GCHandleType.Pinned); 
GCHandle h2 = GCHandle.Alloc(output, GCHandleType.Pinned); 

IntPtr p1 = h1.AddrOfPinnedObject(); 
IntPtr p2 = h2.AddrOfPinnedObject(); 

grd(13, ref p1, ref p2); 

h1.Free(); 
h2.Free(); 

당신의 바이트 순서를 확인, 나는이 생각 ,0 x94 어도비이고 9이 아니며 세 번째 행의 시작 부분에 0x이 없습니다.

이 메서드는 "스위치"역할을하는 첫 번째 매개 변수와 첫 번째 매개 변수를 기반으로 해석되는 다른 두 매개 변수를 사용하여 여러 가지 방법으로 호출 할 수 있습니다.

+0

코드가 작동했지만 일부 수정을 마친 후 – user2529018

+0

가 작동합니다. Code 매개 변수가 1 일 때만 작동합니다. – user2529018

+1

@ user2529018 여기에서 심령 상태가 아니며 사용 코드의 전체 C++ 예제를 게시합니다. 누가 메모리를 할당합니까? 입력과 출력은 어떻게 접근됩니까? 누가 그 기억을 풀어 주나요? – xanatos