windows-nt/Source/XPSP1/NT/ds/adsi/ndsext/exe/main.cpp
2020-09-26 16:20:57 +08:00

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);
}