windows-nt/Source/XPSP1/NT/base/mvdm/vdmredir/vrputil.c
2020-09-26 16:20:57 +08:00

195 lines
3.7 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
vrputil.c
Abstract:
Contains 'private' Vdm Redir (Vrp) 32-bit side utility routines:
VrpMapLastError
VrpMapDosError
VrpTranslateDosNetPath
Author:
Richard L Firth (rfirth) 13-Sep-1991
Environment:
32-bit flat address space
Revision History:
13-Sep-1991 RFirth
Created
--*/
#include <stdio.h>
#include <stdlib.h> // toupper
#include <nt.h>
#include <ntrtl.h> // ASSERT, DbgPrint
#include <nturtl.h>
#include <windows.h>
#include <softpc.h> // x86 virtual machine definitions
#include <vrdlctab.h>
#include <vdmredir.h> // common Vr stuff
#include <vrinit.h>
#include "vrputil.h" // prototypes
#include <lmcons.h>
#include <lmerr.h>
WORD
VrpMapLastError(
VOID
)
/*++
Routine Description:
Gets last error code returned by Win32 function and maps it to corresponding
Dos error
Arguments:
None.
Return Value:
WORD - Dos equivalent error code
--*/
{
DWORD LastError;
LastError = GetLastError();
#ifdef VR_DIAGNOSE
DbgPrint("VrpMapLastError: last error was %d\n", LastError);
#endif
return VrpMapDosError(LastError);
}
WORD
VrpMapDosError(
IN DWORD ErrorCode
)
/*++
Routine Description:
Maps (DWORD) errors returned from Win32 routines to (WORD) Dos errors
Arguments:
ErrorCode - Error code returned from Win32 routine
Return Value:
WORD - Dos equivalent error code
--*/
{
switch (ErrorCode) {
case NERR_UseNotFound:
ErrorCode = ERROR_PATH_NOT_FOUND;
break;
}
return (WORD)ErrorCode;
}
WORD
VrpTranslateDosNetPath(
IN OUT LPSTR* InputString,
OUT LPSTR* OutputString
)
/*++
Routine Description:
Converts a DOS net string: use UPPER CASE, convert / to \. Called with
net strings, so validates them too - expects \\computername\share.
computername is 1 <= name <= 15. sharename is 1 <= name <= 8. There must
be 2 leading back-slashes
BUGBUG: code page? Kanji? DBCS?
Arguments:
InputString - pointer to pointer to string in DOS memory <= LM20_PATHLEN
OutputString - pointer to pointer to string in 32-bit memory
Return Value:
WORD
Success = 0
InputString points to one character past the end of the input string
OutputString points to one character past the end of the output string
Failure = ERROR_INVALID_PARAMETER
--*/
{
char ch;
char lastCh = 0;
int state = 0; // 0 = leading slashes; 1 = computer name; 2 = share name
int slashesToGo = 2;
int charsToGo = 0;
int maxLen = LM20_PATHLEN;
while (ch = *((*InputString)++)) {
--maxLen;
if (maxLen < 0) {
break;
}
if (ch == '/') {
ch = '\\';
} else {
ch = (char)toupper(ch);
}
if (ch == '\\') {
--slashesToGo;
if (slashesToGo < 0) {
break;
}
} else {
if (lastCh == '\\') {
if (slashesToGo) {
break;
} else {
if (state == 0) {
state = 1;
charsToGo = LM20_CNLEN;
slashesToGo = 1;
} else if (state == 1) {
state = 2;
charsToGo = LM20_NNLEN;
slashesToGo = 0;
}
}
}
--charsToGo;
if (charsToGo < 0) {
break;
}
}
*((*OutputString)++) = ch;
lastCh = ch;
}
*((*OutputString)++) = 0;
return ch ? (WORD)ERROR_INVALID_PARAMETER : 0;
}