Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

316 lines
7.1 KiB

/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
crack.cxx
Abstract:
crack
Author:
Larry Zhu (LZhu) June 1, 2002 Created
Environment:
User Mode
Revision History:
--*/
#include "precomp.hxx"
#pragma hdrstop
#include "crack.hxx"
#include <Ntdsapi.h>
#define SKIP_WSPACE(s) while (*s && (*s == TEXT(' ') || *s == TEXT('\t'))) { ++s; }
#define SKIP_NON_WSPACE(s) while (*s && (*s != TEXT(' ') && *s != TEXT('\t') && *s != TEXT('\n'))) { ++s; }
VOID
Usage(
IN PCTSTR pszApp
)
{
SspiPrint(SSPI_ERROR,
TEXT("\n\nUsage: %s [-domaincontroller <domaincontroller>] [-dnsdomainname <dnsdomainname>]\n")
TEXT("[-flags <flags>] [-formatoffered <formatoffered>] [-formatdesired <formatdesired>]\n")
TEXT("[-names <names>]\n\n"), pszApp);
exit(-1);
}
VOID
ReleaseArgumentList(
IN ULONG cArgs,
IN PTSTR* ppszArgs
)
{
if (ppszArgs)
{
for (ULONG i = 0; i < cArgs; i++)
{
delete [] ppszArgs[i];
}
delete [] ppszArgs;
}
}
HRESULT
String2ArgumentList(
IN PTSTR pszArgs,
OUT ULONG* pcArgs,
OUT PTSTR** pppszArgs
)
{
HRESULT hRetval = S_OK;
ULONG cArgs = 0;
PTSTR* ppszArgs = NULL;
PTSTR pszSave = pszArgs;
*pcArgs = NULL;
*pppszArgs = NULL;
while (pszArgs && *pszArgs)
{
SKIP_WSPACE(pszArgs);
++cArgs;
// check for quote
if (*pszArgs == TEXT('"'))
{
++pszArgs;
if (*pszArgs == TEXT('"'))
{
continue;
}
while (*pszArgs && (*pszArgs++ != TEXT('"'))) /* empty */;
if (*(pszArgs - 1) != TEXT('"'))
{
hRetval = E_INVALIDARG;
goto Cleanup;
}
}
else
{
SKIP_NON_WSPACE(pszArgs);
}
}
if (cArgs)
{
pszArgs = pszSave;
ppszArgs = new PTSTR[cArgs];
if (!ppszArgs)
{
hRetval = E_OUTOFMEMORY;
goto Cleanup;
}
RtlZeroMemory(ppszArgs, cArgs * sizeof(PTSTR));
ULONG argc = 0;
while (pszArgs && *pszArgs)
{
SKIP_WSPACE(pszArgs);
PTSTR pStart = pszArgs;
PTSTR pEnd = pStart;
// check for quote
if (*pszArgs == TEXT('"'))
{
++pszArgs;
pStart = pszArgs;
if (*pszArgs == TEXT('"'))
{
pEnd = pStart;
}
else
{
while (*pszArgs && (*pszArgs++ != TEXT('"'))) /* empty */;
pEnd = pszArgs - 1;
}
}
else
{
SKIP_NON_WSPACE(pszArgs);
pEnd = pszArgs;
}
TCHAR* pszItem = new TCHAR[pEnd - pStart + 1];
if (!pszItem)
{
hRetval = E_OUTOFMEMORY;
goto Cleanup;
}
RtlCopyMemory(
pszItem,
pStart,
(pEnd - pStart) * sizeof(TCHAR)
);
pszItem[pEnd - pStart] = TEXT('\0');
ppszArgs[argc] = pszItem;
++argc;
}
}
*pppszArgs = ppszArgs;
*pcArgs = cArgs;
cArgs = 0;
ppszArgs = NULL;
Cleanup:
ReleaseArgumentList(cArgs, ppszArgs);
return hRetval;
}
VOID __cdecl
_tmain(
IN INT argc,
IN PTSTR argv[]
)
{
THResult hRetval = S_OK;
HANDLE hDs = NULL;
PTSTR pszDomainController = NULL;
PTSTR pszDnsDomainName = NULL;
PTSTR pszNames = NULL;
ULONG FormatOffered = DS_USER_PRINCIPAL_NAME;
ULONG FormatDesired = DS_NT4_ACCOUNT_NAME;
ULONG Flags = 0;
ULONG cNames = 0;
PTSTR* rpNames = NULL;
DS_NAME_RESULT* pResult = NULL;
ULONG mark = 1;
argc--;
while (argc)
{
if (!lstrcmp(argv[mark], TEXT("-domaincontroller")) && argc > 1)
{
argc--; mark++;
pszDomainController = argv[mark];
argc--; mark++;
}
else if (!lstrcmp(argv[mark], TEXT("-dnsdomainname")) && argc > 1)
{
argc--; mark++;
pszDnsDomainName = argv[mark];
argc--; mark++;
}
else if (!lstrcmp(argv[mark], TEXT("-formatoffered")) && argc > 1)
{
argc--; mark++;
FormatOffered = lstrtol(argv[mark], NULL, 0);
argc--; mark++;
}
else if (!lstrcmp(argv[mark], TEXT("-formatdesired")) && argc > 1)
{
argc--; mark++;
FormatDesired = lstrtol(argv[mark], NULL, 0);
argc--; mark++;
}
else if (!lstrcmp(argv[mark], TEXT("-flags")) && argc > 1)
{
argc--; mark++;
Flags = lstrtol(argv[mark], NULL, 0);
argc--; mark++;
}
else if (!lstrcmp(argv[mark], TEXT("-names")) && argc > 1)
{
argc--; mark++;
pszNames = argv[mark];
argc--; mark++;
}
else if (!lstrcmp(argv[mark], TEXT("-h"))
|| !lstrcmp(argv[mark], TEXT("-?"))
|| !lstrcmp(argv[mark], TEXT("/h"))
|| !lstrcmp(argv[mark], TEXT("/?")))
{
argc--; mark++;
Usage(argv[0]);
}
else
{
Usage(argv[0]);
}
}
hRetval DBGCHK = String2ArgumentList(pszNames, &cNames, &rpNames);
SspiPrint(SSPI_LOG,
TEXT("DC \"%s\", DnsDomain \"%s\", Flags %#x, Names \"%s\", FormatOffered %#x, FormatDesired %#x, cNames %#x\n"),
pszDomainController,
pszDnsDomainName,
Flags,
pszNames,
FormatOffered,
FormatDesired,
cNames);
if (SUCCEEDED(hRetval))
{
hRetval DBGCHK = HResultFromWin32(
DsBind(
pszDomainController,
pszDnsDomainName,
&hDs
));
}
if (SUCCEEDED(hRetval))
{
hRetval DBGCHK = HResultFromWin32(
DsCrackNames(
hDs,
(DS_NAME_FLAGS) Flags,
(DS_NAME_FORMAT) FormatOffered,
(DS_NAME_FORMAT) FormatDesired,
cNames ,
rpNames,
&pResult
));
}
if (pResult)
{
for (ULONG i = 0; i < pResult->cItems; i++)
{
SspiPrint(SSPI_LOG,
TEXT("Item %#x: status %#x, domain \"%s\", name \"%s\"\n"),
i,
pResult->rItems[i].status,
pResult->rItems[i].pDomain,
pResult->rItems[i].pName);
}
DsFreeNameResult(pResult);
}
if (hDs)
{
DsUnBind(&hDs);
}
}