Некоторые соображения по работе с потоками.
После использования функций NewReadFileStream/NewWriteFileStream нужно выполнять проверку
#pas
if st.Handle = INVALID_HANDLE_VALUE then
begin
// Сообщить об ошибке
st.Free;
Exit;
end;
Также st.Write возвращает количество записанных данных. Нужно проверять равно ли оно тому количеству, которое требовалось записать. Если нет - значит ошибка записи (например, закончилось место на диске или ещё что-то)