Re: Get ASCII value for character when higher than 127
On Tue, 05 Jun 2007 07:25:22 -0700, ssetz@wxs.nl wrote:
For a while, I thought everything worked fine, but now I'm running
into a really weird problem. In some cases, the XOR on the '\0'
In addition to what I've written my previous post, I think that your
C++ code may have other problems...
string GetPwdFilePath()
{
const char* timeStringFormat = "%Y-%m-%d_%H-%M-%S";
const size_t timeStringLength = 20;
char timeString[timeStringLength] = { 0 };
time_t t = time(0);
tm *curTime = localtime(&t);
strftime(timeString, timeStringLength,
timeStringFormat, curTime);
string path("C:\\PwdSync\\pwds\\");
path.append(timeString);
path.append(".pwd");
free(timeString);
******
This is an error.
timeString is allocated in the stack, not in the heap.
So, you must not 'free' it.
BTW: I've not VC++2005, but I thought that it could prevent such
memory leaks/corruption. Didn't VC++ signaled you anything about that?
(I'm aware that the VC++ software engineers did a great job for the
compiler.)
******
string GetLogFilePath()
{
....
free(timeString);
******
Another invalid 'free' here.
******
string ObfuscateUnicodeString(LPCWSTR pwszIn, USHORT nLen)
{
ostringstream oss;
oss << right;
int k = GetNextXORVal(0);
for(size_t i = 0; i < nLen; ++i)
{
int ch = pwszIn[i]^k;
k = GetNextXORVal(k) ;
oss << setw(7) << setfill('0') << ch;
}
string result = oss.str();
oss.clear();
******
oss.clear() is useless here: ostringstream destructor should clear
everything.
******
void WriteMessage(
const string& path,
const string& username,
const string& password,
const string& seperator
)
{
ofstream outPwd(path.c_str());
******
Add std::ios_base::binary as I've written in my previous post.
******
outPwd << username << seperator << password ;
outPwd.close();
}
******
.close() useless here.
******
ofstream outPwd(path.c_str(), ios::app);
if (!outPwd)
{
ofstream outPwd(path.c_str(), ios::out );
}
outPwd << timeString << " - " << logmsg << username << "\n";
outPwd.close();
free(timeString);
}
******
- Add binary flag to ofstream.
- Could remove outPwd.close()
- Must remove free(timeString).
******
NTSTATUS
NTAPI
PasswordChangeNotify(
PUNICODE_STRING UserName,
ULONG RelativeId,
PUNICODE_STRING Password
)
{
char *usernameStr;
usernameStr = (char*)calloc(1, (UserName->Length/2)+1);
wcstombs(usernameStr, UserName->Buffer, (UserName->Length/2));
******
I don't trust this code very much...
If you want to know the size of destination buffer and dynamically
allocate it, you should call wcstombs with first parameter NULL, i.e.
size_t requiredSize = wcstombs(NULL, UserName->Buffer, ...
char * userNameStr = new char[ requiredSize ];
// Then release the buffer using delete[]
We are in C++ world, why do you use malloc/calloc instead of new?
Moreover, I would use the safe version wcstombs_s instead of
deprecated wcstombs...
******
const string& logpath = GetLogFilePath();
******
Why the string reference?
Why not just 'const string logpath = ...' ?
******
const string& username = ObfuscateUnicodeString(UserName->Buffer,
(UserName->Length /2) + 1);
const string& password = ObfuscateUnicodeString(Password->Buffer,
(Password->Length /2) + 1);
const string& seperator = ObfuscateUnicodeString(PSeperator-
Buffer, PSeperator->Length);
const string& path = GetPwdFilePath();
******
I don't understand why you use the 'const string &' here instead of
'const string'...
******
MrAsm