Пишу трояна, стикнувся з проблемою, що функція CredFree вилітає (з певною ймовірністю, звичайно) з ексцепшином в Windows 7 x64, залишається на неї тільки обробник виключень поставити.
Продовження епопеї...
Обробник виключень поставив, тепер інше виключення вилізло через те що CredReadW переповнює кучу (heap) і нема на те ради. Виявилося, що CredReadA таким не займається, тому вимушено замінив CredReadW на неї. Я не хотів викликати функцію CredReadA через те що вважав, що функція поверне значення паролю у форматі чинної кодової сторінки, а воно не так - пароль одержуться в UTF-16 навіть з функції CredReadA.
Продовження епопеї...
Виявилося, що я в функцію CredFree передавав не вказівник на структуру, а вказівник на вказівник на структуру. Тобто замість CredFree(pCred) я писав CredFree(&pCred). Це сталося тому що функція CredFree здатна вивільнювати 2 структури - PCREDENTIALW та PCREDENTIALA, тому її оголосили як int CredFree(void *). А оскільки аргументом функція приймає void * то їй начебто підходить і &pCred і тому компілятор лаятися не буде.