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.
 
 
 
 
 
 

203 lines
6.2 KiB

/****************************** Module Header ******************************\
* Module Name: random.c
*
* Copyright (c) 1985 - 1999, Microsoft Corporation
*
* This module contains a random collection of support routines for the User
* API functions. Many of these functions will be moved to more appropriate
* files once we get our act together.
*
* History:
* 10-17-90 DarrinM Created.
* 02-06-91 IanJa HWND revalidation added (none required)
\***************************************************************************/
/***************************************************************************\
* RtlGetExpWinVer
*
* Returns the expected windows version, in the same format as Win3.1's
* GetExpWinVer(). This takes it out of the module header. As such, this
* api cannot be called from the server context to get version info for
* a client process - instead that information needs to be queried ahead
* of time and passed with any client/server call.
*
* 03-14-92 ScottLu Created.
\***************************************************************************/
DWORD RtlGetExpWinVer(
HANDLE hmod)
{
PIMAGE_NT_HEADERS pnthdr;
DWORD dwMajor = 3;
DWORD dwMinor = 0xA;
/*
* If it doesn't look like a valid 32bit hmod, use the default
* (i.e., assuming all 16bit hmods are 0x30a)
*/
if ((hmod != NULL) && (LOWORD(HandleToUlong(hmod)) == 0)) {
try {
pnthdr = RtlImageNtHeader((PVOID)hmod);
// If for some reason we can't get the header information,
// just return the default
if(pnthdr == NULL) {
goto NO_HEADER;
}
dwMajor = pnthdr->OptionalHeader.MajorSubsystemVersion;
/*
* Still need this hack 'cuz the linker still puts
* version 1.00 in the header of some things.
*/
if (dwMajor == 1) {
dwMajor = 0x3;
} else {
dwMinor = pnthdr->OptionalHeader.MinorSubsystemVersion;
}
} except (W32ExceptionHandler(FALSE, RIP_WARNING)) {
dwMajor = 3; // just to be safe
dwMinor = 0xA;
}
}
/*
* Return this is a win3.1 compatible format:
*
* 0x030A == win3.1
* 0x0300 == win3.0
* 0x0200 == win2.0, etc.
*/
// dwMajor and dwMinor are initialized where they're declared
NO_HEADER:
return (DWORD)MAKELONG(MAKEWORD((BYTE)dwMinor, (BYTE)dwMajor), 0);
}
/***************************************************************************\
* FindCharPosition
*
* Finds position of character ch in lpString. If not found, the length
* of the string is returned.
*
* History:
* 11-13-90 JimA Created.
\***************************************************************************/
DWORD FindCharPosition(
LPWSTR lpString,
WCHAR ch)
{
DWORD dwPos = 0L;
while (*lpString && *lpString != ch) {
++lpString;
++dwPos;
}
return dwPos;
}
/***************************************************************************\
* TextCopy
*
* Returns: number of characters copied not including the NULL
*
* History:
* 10-25-90 MikeHar Wrote.
* 11-09-90 DarrinM Rewrote with a radically new algorithm.
* 01-25-91 MikeHar Fixed the radically new algorithm.
* 02-01-91 DarrinM Bite me.
* 11-26-91 DarrinM Ok, this time it's perfect (except NLS, probably).
* 01-13-92 GregoryW Now it's okay for Unicode.
\***************************************************************************/
UINT TextCopy(
PLARGE_UNICODE_STRING pstr,
LPWSTR pszDst,
UINT cchMax)
{
if (cchMax != 0) {
cchMax = min(pstr->Length / sizeof(WCHAR), cchMax - 1);
RtlCopyMemory(pszDst, KPVOID_TO_PVOID(pstr->Buffer), cchMax * sizeof(WCHAR));
pszDst[cchMax] = 0;
}
return cchMax;
}
/***************************************************************************\
* DWORD wcsncpycch(dest, source, count) - copy no more than n wide chars
*
* Purpose:
* Copies no more than count characters from the source string to the
* destination. If count is less than the length of source,
* NO NULL CHARACTER is put onto the end of the copied string.
* If count is greater than the length of sources, dest is NOT padded
* with more than 1 null character.
*
*
* Entry:
* LPWSTR dest - pointer to destination
* LPWSTR source - source string for copy
* DWORD count - max number of characters to copy
*
* Exit:
* returns number of characters copied into dest, including the null
* terminator, if any.
*
* Exceptions:
*
****************************************************************************/
DWORD wcsncpycch (
LPWSTR dest,
LPCWSTR source,
DWORD count
)
{
LPWSTR start = dest;
while (count && (*dest++ = *source++)) /* copy string */
count--;
return (DWORD)(dest - start);
}
/***************************************************************************\
* DWORD strncpycch(dest, source, count) - copy no more than n characters
*
* Purpose:
* Copies no more than count characters from the source string to the
* destination. If count is less than the length of source,
* NO NULL CHARACTER is put onto the end of the copied string.
* If count is greater than the length of sources, dest is NOT padded
* with more than 1 null character.
*
*
* Entry:
* LPSTR dest - pointer to destination
* LPSTR source - source string for copy
* DWORD count - max number of characters to copy
*
* Exit:
* returns number of characters copied into dest, including the null
* terminator, if any.
*
* Exceptions:
*
*******************************************************************************/
DWORD strncpycch (
LPSTR dest,
LPCSTR source,
DWORD count
)
{
LPSTR start = dest;
while (count && (*dest++ = *source++)) /* copy string */
count--;
return (DWORD)(dest - start);
}