Не должно ли быть
ReadProcessMemory(piProcessInfo.hProcess, (void *)address, buffer, length, &bytesRead);
? Если вы указываете адрес указателя буфера в качестве входного параметра, то ReadProcessMemory копирует его в том месте, где находится указатель буфера (не на буфер, а на указатель буфера, пригодный для использования и далее), и если он находится в стеке, стек поврежден.