291 lines
7.1 KiB
C++
291 lines
7.1 KiB
C++
#include "main.h"
|
|
|
|
#define PWLEN 256
|
|
|
|
BOOL
|
|
GetPassword(
|
|
PWSTR szBuffer,
|
|
DWORD dwLength,
|
|
DWORD *pdwLengthReturn
|
|
);
|
|
|
|
extern "C" int __cdecl wmain(
|
|
IN int argc,
|
|
IN PWSTR argv[]
|
|
)
|
|
{
|
|
DWORD WinError = 0;
|
|
PWSTR szTree = NULL;
|
|
PWSTR szUser = NULL;
|
|
PWSTR szContext = NULL;
|
|
PWSTR szPwd = NULL;
|
|
WCHAR szBuffer[PWLEN+1];
|
|
DWORD dwLength;
|
|
|
|
InitMem();
|
|
|
|
//
|
|
// either with 4 parameters or 2
|
|
//
|
|
if((argc != 5) && (argc != 3)) {
|
|
SelectivePrint(MSG_HELP);
|
|
BAIL();
|
|
}
|
|
|
|
if (argc == 5) {
|
|
if (!(argv[1] && argv[2] && argv[3] && argv[4])) {
|
|
SelectivePrint(MSG_HELP);
|
|
BAIL();
|
|
}
|
|
}
|
|
else {
|
|
ASSERT(argc == 3);
|
|
if (!(argv[1] && argv[2])) {
|
|
SelectivePrint(MSG_HELP);
|
|
BAIL();
|
|
}
|
|
}
|
|
|
|
szTree = argv[2];
|
|
|
|
if (argc == 5) {
|
|
szUser = argv[3];
|
|
szPwd = argv[4];
|
|
|
|
if ((wcscmp(szPwd,L"*") == 0)) {
|
|
|
|
SelectivePrint(MSG_GETPASSWORD,
|
|
szTree);
|
|
|
|
if (GetPassword(szBuffer,PWLEN+1,&dwLength)) {
|
|
szPwd = szBuffer;
|
|
}
|
|
else {
|
|
SelectivePrint(MSG_PASSWORDTOLONG);
|
|
BAIL();
|
|
}
|
|
}
|
|
|
|
while (*szUser) {
|
|
if (*szUser == '.') {
|
|
*szUser = NULL;
|
|
szContext = szUser+1;
|
|
break;
|
|
}
|
|
szUser++;
|
|
}
|
|
szUser = argv[3];
|
|
}
|
|
|
|
if (_wcsicmp(argv[1],g_szExtend) == 0) {
|
|
WinError = Client32ExtendSchema(szTree,
|
|
szContext,
|
|
szUser,
|
|
szPwd);
|
|
if (WinError == ERROR_MOD_NOT_FOUND) {
|
|
WinError = NWAPIExtendSchema(szTree,
|
|
szContext,
|
|
szUser,
|
|
szPwd);
|
|
if (WinError) {
|
|
if (WinError == 1) {
|
|
WinError = 0;
|
|
SelectivePrint(MSG_EXTENDED_ALREADY, szTree);
|
|
}
|
|
BAIL();
|
|
}
|
|
else {
|
|
SelectivePrint(MSG_EXTEND_SUCCESS,szTree);
|
|
}
|
|
}
|
|
else if (WinError) {
|
|
if (WinError == 1) {
|
|
WinError = 0;
|
|
SelectivePrint(MSG_EXTENDED_ALREADY, szTree);
|
|
}
|
|
BAIL();
|
|
}
|
|
else {
|
|
SelectivePrint(MSG_EXTEND_SUCCESS,szTree);
|
|
}
|
|
}
|
|
else if (_wcsicmp(argv[1],g_szCheck) == 0) {
|
|
BOOL fExtended;
|
|
WinError = Client32CheckSchemaExtension(szTree,
|
|
szContext,
|
|
szUser,
|
|
szPwd,
|
|
&fExtended);
|
|
if (WinError == ERROR_MOD_NOT_FOUND) {
|
|
WinError = NWAPICheckSchemaExtension(szTree,
|
|
szContext,
|
|
szUser,
|
|
szPwd,
|
|
&fExtended);
|
|
if (WinError) {
|
|
BAIL();
|
|
}
|
|
}
|
|
else if (WinError) {
|
|
BAIL();
|
|
}
|
|
if (fExtended) {
|
|
WinError = 1;
|
|
SelectivePrint(MSG_EXTENDED,szTree);
|
|
}
|
|
else {
|
|
WinError = 0;
|
|
SelectivePrint(MSG_NOT_EXTENDED,szTree);
|
|
}
|
|
}
|
|
else {
|
|
SelectivePrint(MSG_HELP);
|
|
BAIL();
|
|
}
|
|
|
|
error:
|
|
if (WinError && (WinError != 1)) {
|
|
SelectivePrint(MSG_ERROR,WinError);
|
|
SelectivePrintWin32(WinError);
|
|
|
|
}
|
|
return WinError;
|
|
}
|
|
|
|
void SelectivePrint(DWORD messageID, ...)
|
|
{
|
|
static BOOLEAN bTriedOpen = FALSE;
|
|
PWSTR pszMessageBuffer = NULL;
|
|
DWORD dwSize;
|
|
va_list ap;
|
|
DWORD dwLen;
|
|
|
|
va_start(ap, messageID);
|
|
|
|
dwLen = FormatMessageW(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ALLOCATE_BUFFER,
|
|
NULL,
|
|
messageID,
|
|
0,
|
|
(PWSTR)&pszMessageBuffer,
|
|
4095,
|
|
&ap);
|
|
if (dwLen == 0)
|
|
{
|
|
DWORD WinError = GetLastError();
|
|
ERR(("Error formatting message: %d\n", WinError));
|
|
BAIL();
|
|
}
|
|
|
|
dwSize = wcslen(pszMessageBuffer);
|
|
if (pszMessageBuffer[dwSize-2] == '\r') {
|
|
pszMessageBuffer[dwSize-2] = '\n';
|
|
pszMessageBuffer[dwSize-1] = '\0';
|
|
}
|
|
|
|
|
|
fwprintf(stdout,pszMessageBuffer);
|
|
error:
|
|
va_end(ap);
|
|
if (pszMessageBuffer) {
|
|
LocalFree(pszMessageBuffer);
|
|
}
|
|
return;
|
|
}
|
|
|
|
void SelectivePrintWin32(DWORD dwError)
|
|
{
|
|
DWORD dwLen;
|
|
WCHAR szMessage[256];
|
|
|
|
dwLen = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
|
|
NULL,
|
|
dwError,
|
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
|
szMessage,
|
|
256,
|
|
NULL);
|
|
if (dwLen == 0)
|
|
{
|
|
DWORD WinError = GetLastError();
|
|
ERR(("Error formatting message: %d\n", WinError));
|
|
BAIL();
|
|
}
|
|
|
|
fwprintf(stdout,szMessage);
|
|
error:
|
|
return;
|
|
}
|
|
|
|
#define CR 0xD
|
|
#define BACKSPACE 0x8
|
|
#define NULLC '\0'
|
|
#define NEWLINE '\n'
|
|
|
|
BOOL
|
|
GetPassword(
|
|
PWSTR szBuffer,
|
|
DWORD dwLength,
|
|
DWORD *pdwLengthReturn
|
|
)
|
|
{
|
|
WCHAR ch;
|
|
PWSTR pszBufCur = szBuffer;
|
|
DWORD c;
|
|
int err;
|
|
DWORD mode;
|
|
|
|
//
|
|
// make space for NULL terminator
|
|
//
|
|
dwLength -= 1;
|
|
*pdwLengthReturn = 0;
|
|
|
|
GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),
|
|
&mode);
|
|
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),
|
|
(~(ENABLE_ECHO_INPUT|ENABLE_LINE_INPUT)) & mode);
|
|
|
|
while (TRUE) {
|
|
err = ReadConsole(GetStdHandle(STD_INPUT_HANDLE),
|
|
&ch,
|
|
1,
|
|
&c,
|
|
0);
|
|
if (!err || c != 1)
|
|
ch = 0xffff;
|
|
|
|
if ((ch == CR) || (ch == 0xffff)) // end of line
|
|
break;
|
|
|
|
if (ch == BACKSPACE) { // back up one or two
|
|
//
|
|
// IF pszBufCur == buf then the next two lines are a no op.
|
|
// Because the user has basically backspaced back to the start
|
|
//
|
|
if (pszBufCur != szBuffer) {
|
|
pszBufCur--;
|
|
(*pdwLengthReturn)--;
|
|
}
|
|
}
|
|
else {
|
|
|
|
*pszBufCur = ch;
|
|
|
|
if (*pdwLengthReturn < dwLength)
|
|
pszBufCur++ ; // don't overflow buf
|
|
(*pdwLengthReturn)++; // always increment pdwLengthReturn
|
|
}
|
|
}
|
|
|
|
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), mode);
|
|
|
|
//
|
|
// NULL terminate the string
|
|
//
|
|
*pszBufCur = NULLC;
|
|
putchar(NEWLINE);
|
|
|
|
return((*pdwLengthReturn <= dwLength) ? TRUE : FALSE);
|
|
}
|
|
|