Какое значение имеет шаблон ошибки App Verifier `fafa`?

В программе проверки приложений происходит сбой, и я не до конца понимаю сбой. У меня есть буфер, который динамически распределяется таким образом из числа байтов в файле:

DWORD dwSizeBytes = (DWORD)liSize.QuadPart+2;
TCHAR* JSONBufferW = new TCHAR [dwSizeBytes/sizeof(TCHAR)];
memset(JSONBufferW, 0, dwSizeBytes);

куда dwSizeBytes (Я могу видеть это в аварийном сбросе) 38, После этого я читаю некоторые данные из файла:

if(!ReadFile(hFile, JSONBufferW, dwSizeBytes, &dwSizeBytes, NULL))
{
status = GetLastError();
TRACE_ERROR(g_hTrace, "ReadFile() failed for %S, error code=%d", strCompletePath, status);
}

Это назначает 36 в dwSizeBytes оставляя последние два байта в буфере NULL, чтобы буфер был пустым. Тем не менее, под верификатором приложения это позже вызывает сбой, когда я пытаюсь создать std::wstring из буфера.

Когда я смотрю на блок выделения буфера в windbg, я вижу, что это выглядит так:

0:022> dd 0x00000000`07560fd0-0x48 0x00000000`07560fd0
00000000`07560f88  00001000 00000000 abcdbbbb 00000000
00000000`07560f98  07191000 00000000 00000026 00000000
00000000`07560fa8  00001000 00000000 00000000 00000000
00000000`07560fb8  00000000 00000000 0025a230 00000000
00000000`07560fc8  00001000 dcbabbbb 0022007b

Обратите внимание 0x26 который показывает, что мой буфер должен быть размером 38. Теперь я смотрю на буфер сам и вижу:

0:022> dc 0x00000000`07560fd0
00000000`07560fd0  0022007b 006f006d 00650064 003a0022  {.".m.o.d.e.".:.
00000000`07560fe0  006d0022 006e0061 00610075 0022006c  ".m.a.n.u.a.l.".
00000000`07560ff0  000a007d d0d0fafa d0d0d0d0 d0d0d0d0  }...............

Это показывает, что мой буфер был заполнен ReadFile но где NULL должен был остаться в buf[36] а также buf[37] (помните memset) есть код заполнения верификатора приложения fafa (помните, что байты Unicode перевернуты так d0d0 на самом деле после fafa,

Я смотрел Вот: который показал мне, как приложение-верификатор оставляет эти коды заполнения после выделения. Но fafa нет в списке, так что это значит? И почему это в том месте, где memset должен был очиститься?

0

Решение

У меня нет источника для этого на данный момент, но одна из функций AppVerifier полностью заполняет ваш буфер шаблоном до вызова ReadFile. Вы запрашиваете чтение 38 байтов, AppVerifier заполняет ваш буфер 38 байтами шаблона, а ReadFile читает только 36 байтов из файла. Таким образом, ваши последние 2 байта являются шаблоном заполнения, а не ожидаемыми символами NULL.

1

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

Других решений пока нет …