• XSS.stack #1 – первый литературный журнал от юзеров форума

Сложение двух динамических массивов

pic4a

HDD-drive
Пользователь
Регистрация
09.01.2015
Сообщения
32
Реакции
18
Имеем два массива, один из которых динамический. К этому динамическому массиву нужно дописать второй. Вот собственно реализация.
Флаги нужны для того, чтобы убрать ненужные нулевые байты (концы строк) и соответственно, сменить количество скопированных байт.
Функция также НЕ выделяет дополнительный объем памяти на всякий случай. Тоесть ровно столько, сколько нужно.
Код:
#define DATA_TYPE_BINARY 0
#define DATA_TYPE_WIDECHAR 2
#define DATA_TYPE_CHAR 3
LPVOID memcnc(LPVOID dest, LPCVOID data, LPDWORD destSize, const DWORD dataSize, int dataType)
{
	LPVOID tmp = NULL;
	HANDLE hHeap = GetProcessHeap();
	DWORD resultSize = *destSize + dataSize;
	char* dest_char = (char*)dest;
	if (destSize && dest)
	{
  
  if (hHeap == INVALID_HANDLE_VALUE)
  	return NULL;

  tmp = HeapAlloc(hHeap, HEAP_NO_SERIALIZE, *destSize);
  if (!tmp)
  	return NULL;

  memcpy(tmp, dest, *destSize);
  if (!HeapFree(hHeap, HEAP_NO_SERIALIZE, dest))
  {
  	HeapFree(hHeap, HEAP_NO_SERIALIZE, tmp);
  	return NULL;
  }

  
  dest = HeapAlloc(hHeap, HEAP_ZERO_MEMORY, resultSize);
  if (!dest)
  {
  	HeapFree(hHeap, HEAP_NO_SERIALIZE, tmp);
  	return NULL;
  }

  memcpy(dest, tmp, *destSize);
  dest_char = (char*)dest +(*destSize);

  switch (dataType)
  {
  case DATA_TYPE_CHAR:
  	resultSize -= sizeof(char)*2;
  	dest_char -= sizeof(char);
  	break;
  case DATA_TYPE_WIDECHAR:
  	resultSize -= sizeof(wchar_t)*2;
  	dest_char -= sizeof(wchar_t);
  	break;
  }
  memcpy(dest_char, data, dataSize);
  *destSize = resultSize;
  return dest;
	}
	else
	{
  dest = HeapAlloc(hHeap, HEAP_NO_SERIALIZE, dataSize);
  if (!dest)
  	return NULL;
  memcpy(dest, data, dataSize);
  *destSize = dataSize;

  return dest;
	}
}
 
Заюзал на примере конкатенации строк - не работает. Предлагаю делать следующим образом (POC):

Код:
    char *str[] = {
        "start, ",
        "ab, ",
        "cd, ",
        "ef, ",
        "gh, ",
        "end."
    };

    SYSTEM_INFO si;
    GetSystemInfo(&si);

    HANDLE hHeap = HeapCreate(0, si.dwPageSize, 0);

    char *mem = HeapAlloc(hHeap, HEAP_ZERO_MEMORY, lstrlenA(str[0]) + 1);

    memcpy(mem, str[0], lstrlenA(str[0]) + 1);
    printf("%08X: %s\n", mem, mem);

    for (int i = 1; i < sizeof(str) / sizeof(str[0]); i++) {
        size_t dst_sz = lstrlenA(mem),
               src_sz = lstrlenA(str[i]);

        if(HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, mem, dst_sz + src_sz + 1))
            memcpy(mem + dst_sz, str[i], src_sz + 1);

        printf("%08X: %s\n", mem, mem);
    }

    HeapDestroy(hHeap);

005F07D0: start,
005F07D0: start, ab,
005F07D0: start, ab, cd,
005F07D0: start, ab, cd, ef,
005F07D0: start, ab, cd, ef, gh,
005F07D0: start, ab, cd, ef, gh, end.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх