2017-04-17 74 views
1

爲什麼,如果我命令發送到DeviceIoControlс++把字節數組功能

byte lpInBuffer[44] = { 0x2C, 0x00, 0x00, 0x00, 0x01... }; 
byte lpOutBuffer[88]; 

BOOL result = DeviceIoControl(open, 0x0004D004, lpInBuffer, sizeof(lpInBuffer), &lpOutBuffer, sizeof(lpOutBuffer), 0x00000000, 0x00000000); 

err = GetLastError(); // 
cout << "result:" << result << ", err: " << err << "\n"; 

結果是正確的!

但如果我這樣做,我得到的結果是一個錯誤:

void putMessage(HANDLE handle, int type, int output_len, byte message[]) { 
    byte* lpOutBuffer = new byte[output_len]; 
    byte* lpInBuffer = message; 

    for (int i = 0; i < sizeof(lpInBuffer); i++) { 
     cout << lpInBuffer[i]; 
    } 

    BOOL result = DeviceIoControl(handle, type, lpInBuffer, sizeof(lpInBuffer), &lpOutBuffer, sizeof(lpOutBuffer), 0x00000000, 0x00000000); 


    int err = GetLastError(); 
    cout << "result:" << result << ", err: " << err << "\n"; 

    for (int i = 0; i < sizeof(lpOutBuffer); i++) { 
     cout << lpOutBuffer[i]; 
    } 

    cout << "\n\n"; 
} 

putMessage(open, 0x0004D004, 88, new byte[44]{ 0x2C, 0x00, 0x00, 0x00, 0x01... }); 

回答

0

在你的第一個代碼示例你處理陣列類型的變量,並且這種類型的sizeof是(編譯時間常數已知)以CHAR_BITS位元素爲單位的數組大小。

在第二個代碼示例中,您不是處理數組類型的變量,而是處理指針類型的變量。指針的大小獨立於它可能指向的數組的大小(可能在編譯時未知)。

要解決此問題,您還需要將message大小傳遞給您的函數。從你的函數內部使用該大小以及輸出緩衝區大小而不是那些sizeof表達式。

+0

嗨!爲了清晰起見,我添加了以下代碼:「cout <<」\ n「<< sizeof(message)<<」\ n「<< \t \t sizeof(lpInBuffer)<<」\ n「<< \t \t output_len <<」 \ n」個<< \t \t的sizeof(lpOutBuffer)<< 「\ n」 個;'和我得到的大小的字節數組爲8:'8 8',但字節數組'message' len爲44 – lampa

0

此代碼工作:

void putMessage(HANDLE handle, int type, int output_size, vector<byte> input) { 
    vector<byte> output(output_size); 

    cout << "lpInBuffer:" << input.size() << ", lpOutBuffer: " << output.size() << "\n"; 

    BOOL result = DeviceIoControl(handle, type, input.data(), input.size(), (void*)output.data(), output.size(), 0x00000000, 0x00000000); 

    int err = GetLastError(); // 5 i.e. ERROR_ACCESS_DENIED 
    cout << "result:" << result << ", err: " << err << "\n"; 


    for (int i = 0; i < output.size(); i++) { 
     cout << hexToString(output[i]) << " "; 
    } 

    cout << "\n\n"; 
}