Использование SetWindowText в WIN32 GDI и безопасное удаление данных, набранных в - PullRequest
0 голосов
/ 27 октября 2010

Я хочу безопасно удалить (даже не след в памяти) все, что пользователь вводит в текстовое поле.Интересно, достаточно ли безопасно установить его на ""?SetWindowText - это функция в Win32 API, в user32.dll .

В программе:

SetWindowText(myHandle, "Hello");
SetWindowText(myHandle, "Goodbye");

//Was the buffer containing chars "Hello" overwritten by the
//series of chars "Goodb"?

//Or was another chunk of buffer being allocated to store "Goodbye",
//hence "Hello" still exist somewhere in the memory?

SetWindowText(myHandle, "");
//What does Windows do to the buffer that used to store chars "Goodbye"?
//Does it wipe out and replace the data in the buffer to all 0s here?
//Or does "Goodbye" actually still stays in the memory?

Ответы [ 2 ]

2 голосов
/ 27 октября 2010

Это формально не определено и довольно сложно на практике.Поэтому простой ответ: «Нет, это не безопасно»

1 голос
/ 29 октября 2010

Нет, это не безопасно, потому что GDI копирует вашу строку несколько раз, например, чтобы сделать ее строкой с широким символом: вы используете SetWindowTextA, но это просто оболочка для SetWindowTextW, поэтому SetWindowTextA копирует вашу строку в строку с широким символом.

Для безопасного решения вы должны реализовать собственное текстовое поле с настраиваемой обработкой пользовательского ввода (WM_KEY * и т. Д.) И настраиваемым рендерингом (WM_DRAW).

Чтобы проверить его безопасность, запустите программу под OllyDbg и просканируйтевся память для вашей строки (Alt-M, Ctrl-B).

...