Re: Get ASCII value for character when higher than 127

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



ssetz@xxxxxx wrote:
On 24 mei, 17:14, "Ben Voigt" <r...@xxxxxxxxxxxxx> 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;
}

Sandra:

A few things I notice:

1. Why are you using Length/2 when converting to UTF-8? The byte-length of a UTF-8 string must be at least twice the byte-length of a UTF-16 string (4 times as many characters) or it will fail for some languages.

2. You are not freeing userNameStr and passwordStr. I would use std::vector<char> and pass pointer to first element to WideCharToMultiByte().

3. You should always check the return value of WideCharToMultiByte().

4. Better to use std::ostringstream than fixed size buffer xmlmsg, strcpy and strcat are very dangerous functions

5. I don't see immediately why your file output is not what you expect, but why do you not just output the UTF-8 xml string to the file?

--
David Wilkinson
Visual C++ MVP
.



Relevant Pages