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