http — C ++ WriteFile только запись 4 байта

Вот чего я пытаюсь достичь; Я подключаюсь к функции HttpSendRequest (на Xbox это XHttp) и пытаюсь вывести сертификат, который находится в pcszHeaders, который имеет размер 0x1F0E.

Теперь проблема; кажется, что он записывает только 4 байта, я даже пытался выделить дополнительную память и установить каждый бит в 0, чтобы увидеть, равен ли он размеру заголовков, и он продолжает записывать только 4 байта. Мне удалось удаленно сбросить pcszHeaders, потому что я получил адрес во время отладки, но мне нужно сбросить его во время выполнения.

Что-то, что я замечаю во время отладки — адрес pcszHeaders отображается только в локальных компьютерах, пока не достигнет;

 printf("XHttpSendRequest: %s\n", "Creating Certificate.bin...");

Как только он достигает printf () выше, адрес меняется на 0x00000000 (неверный ptr), но он все равно правильно записывает первый байт корректных данных pcszHeaders, но не более того.

Здесь весь крючок;

BOOL XHTTP_SEND_REQUEST_HOOK(
HINTERNET hRequest,
const CHAR *pcszHeaders,
DWORD dwHeadersLength,
const VOID *lpOptional,
DWORD dwOptionalLength,
DWORD dwTotalLength,
DWORD_PTR dwContext)
{

if(pcszHeaders != XHTTP_NO_ADDITIONAL_HEADERS)
{

printf("XHttpSendRequest: %s\n", "Creating Certificate.bin...");

// Setup expansion
doMountPath("Hdd:", "\\Device\\Harddisk0\\Partition1");

//create our file
HANDLE fileHandle = CreateFile("Hdd:\\Certificate.bin", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);

//does file exist?
if(GetLastError()!=ERROR_ALREADY_EXISTS
||fileHandle!=INVALID_HANDLE_VALUE)
{
printf("XHttpSendRequest: %s\n", "Writing to file...");

DWORD wfbr;

//write to our file
if(WriteFile(fileHandle, pcszHeaders, 0x2000, &wfbr, NULL))
{
printf("XHttpSendRequest: %s\n", "File written!");
printf("%s\n", "Request has ended.");

CloseHandle(fileHandle);
return XHttpSendRequest(hRequest, pcszHeaders, dwHeadersLength, lpOptional, dwOptionalLength, dwTotalLength, dwContext);
}
}
}
}

РЕДАКТИРОВАТЬ: я немного изменил код, и я скопировал данные pcszHeaders в другой раздел памяти, который я создал, и мои указатели, кажется, содержат все правильные данные, и я попытался записать их в файл, и он все еще только пишет 4 байта. Я даже использовал sizeof () вместо жестко запрограммированного 0x2000.

-1

Решение

pcszHeaders это char* указатель. sizeof(pcszHeaders) 4 в 32-битном приложении (8 в 64-битном приложении). Вам нужно использовать dwHeadersLength параметр вместо этого, который говорит вам, сколько символов в pcszHeaders,

Кроме того, ваш GetLastError() проверить после CreateFile() неправильно. Если CreateFile() не удается по любой причине, кроме ERROR_ALREADY_EXISTS, вы вводите блок кода и, таким образом, записываете данные в неверный дескриптор файла. Когда используешь CREATE_NEW, CreateFile() возвращается INVALID_HANDLE_VALUE если файл уже существует Вам не нужно проверять GetLastError() для этого, проверка на INVALID_HANDLE_VALUE само по себе достаточно. Если вы хотите перезаписать существующий файл, используйте CREATE_ALWAYS вместо.

Вы также пропускаете дескриптор файла, если WriteFile() выходит из строя.

И вы называете оригинал HttpSendRequest() только если вы успешно записываете заголовки в свой файл. Если заголовки отсутствуют или происходит сбой создания / записи, вы не разрешаете выполнение запроса. Это то, что вы действительно хотите?

Попробуйте это вместо этого:

BOOL XHTTP_SEND_REQUEST_HOOK(
HINTERNET hRequest,
const CHAR *pcszHeaders,
DWORD dwHeadersLength,
const VOID *lpOptional,
DWORD dwOptionalLength,
DWORD dwTotalLength,
DWORD_PTR dwContext)
{
if (pcszHeaders != XHTTP_NO_ADDITIONAL_HEADERS)
{
printf("XHttpSendRequest: Creating Certificate.bin...\n");

// Setup expansion
doMountPath("Hdd:", "\\Device\\Harddisk0\\Partition1");

//create our file
HANDLE fileHandle = CreateFile("Hdd:\\Certificate.bin", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);

//is file open?
if (fileHandle != INVALID_HANDLE_VALUE)
{
printf("XHttpSendRequest: Writing to file...\n");

DWORD wfbr;

//write to our file
if (WriteFile(fileHandle, pcszHeaders, dwHeadersLength, &wfbr, NULL))
printf("XHttpSendRequest: File written!\n");
else
printf("XHttpSendRequest: Error writing to file: %u\n", GetLastError());

CloseHandle(fileHandle);
}
else
printf("XHttpSendRequest: Error creating file: %u\n", GetLastError());
}

printf("Request has ended.\n");
return XHttpSendRequest(hRequest, pcszHeaders, dwHeadersLength, lpOptional, dwOptionalLength, dwTotalLength, dwContext);
}
0

Другие решения

Наконец проблема была решена!

Сначала я создал пустой массив для хранения данных.

CHAR xtoken[0x2000];
memset(xtoken, 0, 0x2000);

Первая часть ловушки заключается в хранении данных заголовка.

DWORD bufferLength = dwHeadersLength;
memcpy(xtoken, pcszHeaders, bufferLength);

Затем я записываю данные в файл

WriteFile(fileHandle, (void*)&xtoken, bufferLength, &wfbr, NULL))

Успех! Я думаю, проблема была в том, что параметр 2 WriteFile() было неверно.

0

По вопросам рекламы [email protected]