windows-nt/Source/XPSP1/NT/base/ntsetup/win95upg/w95upgnt/migmain/pcache.h

284 lines
5.6 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/* Copyright (c) 1992-2001, Microsoft Corporation, all rights reserved
**
** pcache.h
** Remote Access Phonebook - Win9x Password cache (PWL) decrypter
** Private header
**
** Portions of this code have been ported from:
** Win9x\proj\net\user\src\WNET\PCACHE
**
** Whistler bug: 208318 Win9x Upg: Username and Password for DUN connectoid not
** migrated from Win9x to Whistler
**
** 06/24/92 gregj
** 03/06/01 Jeff Sigman
*/
#ifndef _PCACHE_H_
#define _PCACHE_H_
//----------------------------------------------------------------------------
// Constants
//----------------------------------------------------------------------------
#define IERR_PCACHE_BASE 7200
#define IERR_BadSig (IERR_PCACHE_BASE + 1)
#define IERR_CacheEntryNotFound (IERR_PCACHE_BASE + 4)
#define IERR_IncorrectUsername (IERR_PCACHE_BASE + 6)
#define IERR_CacheCorrupt (IERR_PCACHE_BASE + 7)
#define PLAINTEXT_SIGNATURE 0x4E464DB0
#define NEW_PLAINTEXT_SIGNATURE 0x968582E3
#define PCE_END_MARKER 0x8000
#define BUCKET_COUNT 16
#define RAS_MaxPortName MAX_PATH
#define MAX_ENTRY_SIZE 250 // so total file size < 64K
#define PCE_MISC 0x06 // entry is for some other resource
#define MAX_PHONENUMBER_SIZE 128
#define MAX_CALLBACKNUMBER_SIZE MAX_PHONENUMBER_SIZE
#define DLPARAMS_MASK_USERNAME 0x00000001
#define DLPARAMS_MASK_PASSWORD 0x00000002
#define DLPARAMS_MASK_DOMAIN 0x00000004
#define DLPARAMS_MASK_OLDSTYLE 0x80000000
#define S_RESOURCEMASK2 "*Rna\\%s\\%s"
#define S_SRCHPWL "*.PWL"
#define S_PWLDIR "\\Pwls"
//----------------------------------------------------------------------------
// Datatypes
//----------------------------------------------------------------------------
typedef struct
{
USHORT cbResource;
USHORT cbPassword;
UCHAR iEntry;
UCHAR nType;
USHORT dchResource;
USHORT dchPassword;
}
CACHE_ENTRY_INFO;
typedef struct
{
USHORT cbEntry;
USHORT cbResource;
USHORT cbPassword;
UCHAR iEntry;
UCHAR nType;
CHAR abResource[ 1 ];
}
PASSWORD_CACHE_ENTRY;
typedef struct
{
CHAR abRandomPadding[ 16 ];
CHAR abAuthenticationHash[ 16 ];
USHORT aibBuckets[ BUCKET_COUNT + 1 ];
}
NEW_ENCRYPTED_HEADER;
typedef struct
{
USHORT cbBlob;
}
KEYBLOB;
typedef struct
{
ULONG ulSig;
ULONG ulSerial;
USHORT cMRUEntries;
UCHAR aiOrder[ 255 ];
UCHAR aiBucket[ 255 ];
DWORD cbHeader;
DWORD adwBucketSalts[ BUCKET_COUNT + 1 ];
KEYBLOB keyBlobs;
}
NEW_PLAINTEXT_HEADER;
typedef struct _RAS_DIALPARAMS {
DWORD DP_Uid;
WCHAR DP_PhoneNumber[MAX_PHONENUMBER_SIZE + 1];
WCHAR DP_CallbackNumber[MAX_CALLBACKNUMBER_SIZE + 1];
WCHAR DP_UserName[UNLEN + 1];
WCHAR DP_Password[PWLEN + 1];
WCHAR DP_Domain[DNLEN + 1];
DWORD DP_SubEntry;
} RAS_DIALPARAMS, *PRAS_DIALPARAMS;
//----------------------------------------------------------------------------
// Macros
//----------------------------------------------------------------------------
#define FIELDOFFSET(type,field) (((CHAR*)&(((type*)NULL)->field))-((CHAR*)NULL))
#define BREAK_ON_DWERR(_e) if ((_e)) break;
#define NEXT_PCE(pce) ((PASSWORD_CACHE_ENTRY*)(((CHAR*)(pce))+(pce)->cbEntry))
#undef min
#define min(a,b) ((a)<(b)?(a):(b))
//----------------------------------------------------------------------------
// Prototypes
//----------------------------------------------------------------------------
DWORD (* g_SetEntryDialParams) (
IN PWCHAR pszSid,
IN DWORD dwUID,
IN DWORD dwSetMask,
IN DWORD dwClearMask,
IN PRAS_DIALPARAMS lpRasDialParams
);
UINT
HashName (
const CHAR* pbResource,
WORD cbResource
);
VOID
Encrypt (
CHAR *pbSource,
WORD cbSource,
CHAR *pbDest
);
VOID
Decrypt (
CHAR *pbSource,
WORD cbSource
);
VOID
ENCRYPTER (
const CHAR* pszUsername,
const CHAR* pszPassword,
UINT iBucket,
DWORD dwSalt
);
DWORD
ReadData (
WORD ibSeek,
PVOID pbBuffer,
WORD cbBuffer
);
VOID
AssembleFindCacheName (
CHAR* pszWindir,
CHAR* pszResult
);
DWORD
OpenCacheFile (
VOID
);
DWORD
ReadAndDecrypt (
WORD ibSeek,
PVOID pbBuffer,
WORD cbBuffer
);
INT
CompareCacheNames (
const CHAR* pbRes1,
WORD cbRes1,
const CHAR* pbRes2,
WORD cbRes2
);
DWORD
LoadEncryptedHeader (
VOID
);
DWORD
LoadPlaintextHeader (
VOID
);
DWORD
LookupEntry (
const CHAR* pbResource,
WORD cbResource,
UCHAR nType,
PASSWORD_CACHE_ENTRY** ppce
);
DWORD
ValidateEncryptedHeader (
VOID
);
DWORD
FindPWLResource (
const CHAR* pbResource,
WORD cbResource,
CHAR* pbBuffer,
WORD cbBuffer,
UCHAR nType
);
DWORD
FindNewestFile (
IN OUT CHAR* SourceName
);
VOID
DeleteAllPwls (
VOID
);
BOOL
StrCpyAFromWUsingAnsiEncoding(
LPSTR pszDst,
LPCWSTR pszSrc,
DWORD dwDstChars
);
BOOL
StrCpyWFromAUsingAnsiEncoding(
WCHAR* pszDst,
LPCSTR pszSrc,
DWORD dwDstChars
);
VOID
CopyAndTruncate (
LPSTR lpszDest,
LPCSTR lpszSrc,
UINT cbDest,
BOOL flag
);
DWORD
OpenPWL (
CHAR* Username,
CHAR* Password,
BOOL flag
);
DWORD
FindPWLString (
IN CHAR* EntryName,
IN CHAR* ConnUser,
IN OUT CHAR* Output
);
BOOL
MigrateEntryCreds (
IN OUT PRAS_DIALPARAMS prdp,
IN PCTSTR pszEntryName,
IN PCTSTR pszUserName,
IN PDWORD pdwFlag
);
#endif // _PCACHE_H_