On 24 mei, 17:14, "Ben Voigt" <r...@nospam.nospam> wrote:
Instead of wcstombs, use WideCharToMultiByte and CP_UTF8
http://msdn2.microsoft.com/en-us/library/ms776420.aspx
Also write the UTF byte order mark to the beginning of the file, so it will
be decoded correctly by other programs (eg Notepad)
Thanks, this helped me further a bit. But I'm still not able to get
the correct int value for the special characters. For example, when I
reset a users password to the following:
??Abc1????p$%^
The int values that are written to my textfile for the password file
are:
0-61-0-87-0065-0098-0099-0049-0-58--110-0-61-0-85-0112-
And this should be:
0130-0065-0098-0099-0049-0159-0137-0112-0036-0037-0094-
Any idea what it is I'm still doing wrong? My code now looks like
below.
Thanks again,
Sandra
=========================================================
#include <windows.h>
#include <ntsecapi.h>
#include <time.h>
#include <fstream>
#include <iostream>
#include "PwdHookNew.h"
#include <sstream>
#include <string>
#include <iomanip>
#include <lm.h>
using namespace std;
#ifndef STATUS_SUCCESS
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
#endif
string GetASCIIString(string oristring)
{
bool test = true;
int i, k;
string numstrings;
ostringstream oss;
for(i=0;i<oristring.size();i++)
{
k = int(oristring[i]);
oss << setw(4) << setfill('0') << k << '-';
}
numstrings=oss.str();
oss.clear();
return numstrings;
}
NTSTATUS
NTAPI
PasswordChangeNotify(
PUNICODE_STRING UserName,
ULONG RelativeId,
PUNICODE_STRING Password
)
{
// ******************************************
// *** get filename ***
// ******************************************
const char* timeStringFormat = "%Y-%m-%d_%H-%M-%S";
const int timeStringLength = 20;
char timeString[timeStringLength];
time_t t = time(0);
tm *curTime = localtime(&t);
strftime(timeString, timeStringLength, timeStringFormat, curTime);
char path[80];
strcpy (path,"C:\\pwds\\");
strcat (path,timeString);
strcat (path,".txt");
// *******************************
// *** get pwd and user string ***
// *******************************
char *usernameStr, *passwordStr;
usernameStr = (char*)calloc(1, (UserName->Length/2)+1);
passwordStr = (char*)calloc(1, (Password->Length/2)+1);
WideCharToMultiByte(
CP_UTF8, 0, UserName->Buffer, -1,
usernameStr, (UserName->Length/2), NULL,
NULL );
WideCharToMultiByte(
CP_UTF8, 0, Password->Buffer, -1,
passwordStr, (Password->Length/2), NULL,
NULL );
char xmlmsg[200];
strcpy (xmlmsg,"<userpwd><username>");
strcat (xmlmsg,usernameStr);
strcat (xmlmsg,"</username><password>");
strcat (xmlmsg,passwordStr);
strcat (xmlmsg,"</password></userpwd>");
string asciiString = GetASCIIString(xmlmsg);
// ********************
// *** write output ***
// ********************
fstream outPwd(path, ios::app);
if (!outPwd)
{
fstream outPwd(path, ios::out );
}
outPwd << asciiString;
outPwd.close();
return STATUS_SUCCESS;
}
1. Why are you using Length/2 when converting to UTF-8? The byte-length
string (4 times as many characters) or it will fail for some languages.
2. You are not freeing userNameStr and passwordStr. I would use
WideCharToMultiByte().
3. You should always check the return value of WideCharToMultiByte().
4. Better to use std::ostringstream than fixed size buffer xmlmsg,
5. I don't see immediately why your file output is not what you expect,