/******************************************************************************* * * apisub.c * * RegApi helpers and convertion routines * * Copyright Microsoft Corporation, 1998 * * *******************************************************************************/ /* * Includes */ #include #include #include #include #include /* * General purpose UNICODE <==> ANSI functions */ VOID UnicodeToAnsi( CHAR *, ULONG, WCHAR * ); VOID AnsiToUnicode( WCHAR *, ULONG, CHAR * ); /* * Reg Create helpers */ LONG SetNumValue( BOOLEAN, HKEY, LPWSTR, DWORD ); LONG SetNumValueEx( BOOLEAN, HKEY, LPWSTR, DWORD, DWORD ); LONG SetStringValue( BOOLEAN, HKEY, LPWSTR, LPWSTR ); LONG SetStringValueEx( BOOLEAN, HKEY, LPWSTR, DWORD, LPWSTR ); DWORD SetStringInLSA( LPWSTR, LPWSTR ); /* * Reg Query helpers */ DWORD GetNumValue( HKEY, LPWSTR, DWORD ); DWORD GetNumValueEx( HKEY, LPWSTR, DWORD, DWORD ); LONG GetStringValue( HKEY, LPWSTR, LPWSTR, LPWSTR, DWORD ); LONG GetStringValueEx( HKEY, LPWSTR, DWORD, LPWSTR, LPWSTR, DWORD ); DWORD GetStringFromLSA( LPWSTR, LPWSTR, DWORD ); /* * LSA helpers */ void InitLsaString(LPWSTR String, PLSA_UNICODE_STRING lusString); NTSTATUS GetLSAPolicyHandle(DWORD , PLSA_HANDLE ); /* * Pd conversion helpers. */ VOID PdConfigU2A( PPDCONFIGA, PPDCONFIGW ); VOID PdConfigA2U( PPDCONFIGW, PPDCONFIGA ); VOID PdConfig2U2A( PPDCONFIG2A, PPDCONFIG2W ); VOID PdConfig2A2U( PPDCONFIG2W, PPDCONFIG2A ); VOID PdConfig3U2A( PPDCONFIG3A, PPDCONFIG3W ); VOID PdConfig3A2U( PPDCONFIG3W, PPDCONFIG3A ); VOID PdParamsU2A( PPDPARAMSA, PPDPARAMSW ); VOID PdParamsA2U( PPDPARAMSW, PPDPARAMSA ); VOID AsyncConfigU2A ( PASYNCCONFIGA, PASYNCCONFIGW ); VOID AsyncConfigA2U ( PASYNCCONFIGW, PASYNCCONFIGA ); VOID NetworkConfigU2A ( PNETWORKCONFIGA, PNETWORKCONFIGW ); VOID NetworkConfigA2U ( PNETWORKCONFIGW, PNETWORKCONFIGA ); VOID NasiConfigU2A ( PNASICONFIGA, PNASICONFIGW ); VOID NasiConfigA2U ( PNASICONFIGW, PNASICONFIGA ); VOID OemTdConfigU2A ( POEMTDCONFIGA, POEMTDCONFIGW ); VOID OemTdConfigA2U ( POEMTDCONFIGW, POEMTDCONFIGA ); /* * WinStation conversion helpers (regapi). */ VOID WinStationCreateU2A( PWINSTATIONCREATEA, PWINSTATIONCREATEW ); VOID WinStationCreateA2U( PWINSTATIONCREATEW, PWINSTATIONCREATEA ); VOID WinStationConfigU2A( PWINSTATIONCONFIGA, PWINSTATIONCONFIGW ); VOID WinStationConfigA2U( PWINSTATIONCONFIGW, PWINSTATIONCONFIGA ); VOID UserConfigU2A( PUSERCONFIGA, PUSERCONFIGW ); VOID UserConfigA2U( PUSERCONFIGW, PUSERCONFIGA ); /* * WinStation conversion helpers (winstapi). */ VOID WinStationPrinterU2A( PWINSTATIONPRINTERA, PWINSTATIONPRINTERW ); VOID WinStationPrinterA2U( PWINSTATIONPRINTERW, PWINSTATIONPRINTERA ); VOID WinStationInformationU2A( PWINSTATIONINFORMATIONA, PWINSTATIONINFORMATIONW ); VOID WinStationInformationA2U( PWINSTATIONINFORMATIONW, PWINSTATIONINFORMATIONA ); VOID WinStationClientU2A( PWINSTATIONCLIENTA, PWINSTATIONCLIENTW ); VOID WinStationProductIdU2A( PWINSTATIONPRODIDA, PWINSTATIONPRODIDW ); /* * Wd conversion helpers. */ VOID WdConfigU2A( PWDCONFIGA, PWDCONFIGW ); VOID WdConfigA2U( PWDCONFIGW, PWDCONFIGA ); /* * Cd conversion helpers. */ VOID CdConfigU2A( PCDCONFIGA, PCDCONFIGW ); VOID CdConfigA2U( PCDCONFIGW, PCDCONFIGA ); /* * procedures used (not defined here) */ VOID RtlUnicodeToMultiByteN( LPSTR, ULONG, PULONG, LPWSTR, ULONG ); VOID RtlMultiByteToUnicodeN( LPWSTR, ULONG, PULONG, LPSTR, ULONG ); /******************************************************************************* * * UnicodeToAnsi * * convert a UNICODE (WCHAR) string into an ANSI (CHAR) string * * ENTRY: * * pAnsiString (output) * buffer to place ANSI string into * lAnsiMax (input) * maximum number of BYTES to write into pAnsiString (sizeof the * pAnsiString buffer) * pUnicodeString (input) * UNICODE string to convert * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID UnicodeToAnsi( CHAR * pAnsiString, ULONG lAnsiMax, WCHAR * pUnicodeString ) { ULONG ByteCount; RtlUnicodeToMultiByteN( pAnsiString, lAnsiMax, &ByteCount, pUnicodeString, ((wcslen(pUnicodeString) + 1) << 1) ); } /******************************************************************************* * * AnsiToUnicode * * convert an ANSI (CHAR) string into a UNICODE (WCHAR) string * * ENTRY: * * pUnicodeString (output) * buffer to place UNICODE string into * lUnicodeMax (input) * maximum number of BYTES to write into pUnicodeString (sizeof the * pUnicodeString buffer). * pAnsiString (input) * ANSI string to convert * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID AnsiToUnicode( WCHAR * pUnicodeString, ULONG lUnicodeMax, CHAR * pAnsiString ) { ULONG ByteCount; RtlMultiByteToUnicodeN( pUnicodeString, lUnicodeMax, &ByteCount, pAnsiString, (strlen(pAnsiString) + 1) ); } /******************************************************************************* * * SetNumValue * * Set numeric (DWORD) value in registry * * ENTRY: * * bSetValue (input) * TRUE to set value; FALSE to delete from registry * Handle (input) * registry handle * ValueName (input) * name of registry value to set * ValueData (input) * data (DWORD) for registry value to set * * EXIT: * status from RegDeleteValue or RegSetValueEx * ******************************************************************************/ LONG SetNumValue( BOOLEAN bSetValue, HKEY Handle, LPWSTR ValueName, DWORD ValueData ) { if ( bSetValue ) return( RegSetValueEx( Handle, ValueName, 0, REG_DWORD, (BYTE *)&ValueData, sizeof(DWORD) ) ); else return( RegDeleteValue( Handle, ValueName ) ); } /******************************************************************************* * * SetNumValueEx * * Set numeric (DWORD) value in registry (for use with arrays) * * ENTRY: * * bSetValue (input) * TRUE to set value; FALSE to delete from registry * Handle (input) * registry handle * ValueName (input) * name of registry value to set * Index (input) * Index of value (array index) * ValueData (input) * data (DWORD) for registry value to set * * EXIT: * status from SetNumValue * ******************************************************************************/ LONG SetNumValueEx( BOOLEAN bSetValue, HKEY Handle, LPWSTR ValueName, DWORD Index, DWORD ValueData ) { WCHAR Name[MAX_REGKEYWORD]; if ( Index > 0 ) swprintf( Name, L"%s%u", ValueName, Index ); else wcscpy( Name, ValueName ); return( SetNumValue( bSetValue, Handle, Name, ValueData ) ); } /******************************************************************************* * * SetStringValue * * Set string value in registry * * ENTRY: * * bSetValue (input) * TRUE to set value; FALSE to delete from registry * Handle (input) * registry handle * ValueName (input) * name of registry value to set * pValueData (input) * data (string) for registry value to set * * EXIT: * status from RegDeleteValue or RegSetValueEx * ******************************************************************************/ LONG SetStringValue( BOOLEAN bSetValue, HKEY Handle, LPWSTR ValueName, LPWSTR pValueData ) { if ( bSetValue ) return( RegSetValueEx( Handle, ValueName, 0, REG_SZ, (BYTE *)pValueData, (wcslen(pValueData)+1)<<1 ) ); else return( RegDeleteValue( Handle, ValueName ) ); } /******************************************************************************* * * SetStringValueEx * * Set string value in registry (for use with arrays) * * ENTRY: * * bSetValue (input) * TRUE to set value; FALSE to delete from registry * Handle (input) * registry handle * ValueName (input) * name of registry value to set * Index (input) * Index of value (array index) * pValueData (input) * data (string) for registry value to set * * EXIT: * status from SetStringValue * ******************************************************************************/ LONG SetStringValueEx( BOOLEAN bSetValue, HKEY Handle, LPWSTR ValueName, DWORD Index, LPWSTR pValueData ) { WCHAR Name[MAX_REGKEYWORD]; if ( Index > 0 ) swprintf( Name, L"%s%u", ValueName, Index ); else wcscpy( Name, ValueName ); return( SetStringValue( bSetValue, Handle, Name, pValueData ) ); } /******************************************************************************* * * SetStringInLSA * * Set password in LSA secret * * ENTRY: * * pwszString (input) * password (string) secret to be stored in LSA, it's ok if this is NULL * * EXIT: * status from LsaStorePrivateData * ******************************************************************************/ DWORD SetStringInLSA(LPWSTR pwszStringKeyName, LPWSTR pwszString) { LSA_HANDLE hLSAPolicy = NULL; LSA_UNICODE_STRING lusName; LSA_UNICODE_STRING lusSecret; NTSTATUS ntsResult; // Get the policy handle ntsResult = GetLSAPolicyHandle(POLICY_CREATE_SECRET, &hLSAPolicy); if (ntsResult != ERROR_SUCCESS) { goto Cleanup; } // Create UNICODE string for the secret key name InitLsaString(pwszStringKeyName, &lusName); // Create UNICODE string for the secret InitLsaString(pwszString, &lusSecret); // Store the secret in LSA ntsResult = LsaStorePrivateData(hLSAPolicy, &lusName, &lusSecret); Cleanup: // close lsa handle if (hLSAPolicy != NULL) LsaClose(hLSAPolicy); // Convert NTSTATUS result to Windows error code return LsaNtStatusToWinError(ntsResult); } /******************************************************************************* * * InitLsaString * * Initialize LSA unicode string. * * ENTRY: * * String : (IN) String to initialize LsaString. * lusString (IN/OUT): Pointer to LSA_UNICODE_STRING to be initialized. * * EXIT: * status from LsaStorePrivateData * ******************************************************************************/ void InitLsaString(LPWSTR String, PLSA_UNICODE_STRING lusString) { // Create UNICODE string for the passed in string if (String == NULL) { lusString->Buffer = NULL; lusString->Length = 0; lusString->MaximumLength = 0; } else { lusString->Buffer = String; lusString->Length = wcslen(String) * sizeof(WCHAR); lusString->MaximumLength = lusString->Length + (2 * sizeof(WCHAR)); } } /******************************************************************************* * * GetLSAPolicyHandle * * Create/return a LSA policy handle. * * ENTRY: * * ServerName : Name of server, refer to LsaOpenPolicy(). * DesiredAccess : Desired access level, refer to LsaOpenPolicy(). * PolicyHandle : Return PLSA_HANDLE. * * EXIT: * ERROR_SUCCESS or LSA error code * ******************************************************************************/ NTSTATUS GetLSAPolicyHandle(DWORD dwDesiredAccess, PLSA_HANDLE phLSAPolicy) { NTSTATUS ntsResult; LSA_OBJECT_ATTRIBUTES ObjectAttributes; ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes)); // Open handle to the Policy object for the local system ntsResult = LsaOpenPolicy(NULL, &ObjectAttributes, dwDesiredAccess, phLSAPolicy); return ntsResult; } /******************************************************************************* * * GetStringFromLSA * * Get password secret from LSA * * ENTRY: * * pwszString (output) * string stored in LSA * DWORD dwBuffLen (in) * length of passed in buffer size * * EXIT: * status from LsaRetrievePrivateData * ******************************************************************************/ DWORD GetStringFromLSA(LPWSTR pwszStringKeyName, LPWSTR pwszString, DWORD dwBuffLen) { LSA_HANDLE hLSAPolicy = NULL; LSA_UNICODE_STRING lusName; PLSA_UNICODE_STRING plusSecret = NULL; NTSTATUS ntsResult; DWORD dwStatus = S_OK; // Get the policy handle ntsResult = GetLSAPolicyHandle(POLICY_GET_PRIVATE_INFORMATION, &hLSAPolicy); if (ntsResult != ERROR_SUCCESS) { // Convert result to a window status dwStatus = LsaNtStatusToWinError(ntsResult); goto Cleanup; } // Create UNICODE string for the secret key name InitLsaString(pwszStringKeyName, &lusName); // Retrieve the secret from LSA ntsResult = LsaRetrievePrivateData(hLSAPolicy, &lusName, &plusSecret); if (ntsResult != ERROR_SUCCESS) { // Convert result to a window status dwStatus = LsaNtStatusToWinError(ntsResult); goto Cleanup; } // It's possible the return string is NULL (this means there is no // current value) so we'll set the return string to NULL and leave if (plusSecret == NULL) { pwszString = NULL; goto Cleanup; } // Make sure the size of buffer is large enough if (dwBuffLen > (plusSecret->Length / sizeof(WCHAR))) { dwBuffLen = plusSecret->Length / sizeof(WCHAR); } // Copy over the password to the output buffer and null terminate it wcsncpy(pwszString, plusSecret->Buffer, dwBuffLen); pwszString[dwBuffLen] = L'\0'; Cleanup: if (plusSecret != NULL) LsaFreeMemory(plusSecret); // close lsa handle if (hLSAPolicy != NULL) LsaClose(hLSAPolicy); return dwStatus; } /******************************************************************************* * * GetNumValue * * get numeric (DWORD) value from registry * * ENTRY: * * Handle (input) * registry handle * ValueName (input) * name of registry value to query * DefaultData (input) * default value to return if registry value name does not exist * * EXIT: * registry value (DWORD) * ******************************************************************************/ DWORD GetNumValue( HKEY Handle, LPWSTR ValueName, DWORD DefaultData ) { LONG Status; DWORD ValueType; DWORD ValueData; DWORD ValueSize = sizeof(DWORD); Status = RegQueryValueEx( Handle, ValueName, NULL, &ValueType, (LPBYTE) &ValueData, &ValueSize ); if ( Status != ERROR_SUCCESS ) ValueData = DefaultData; return( ValueData ); } /******************************************************************************* * * GetNumValueEx * * get numeric (DWORD) value from registry (for use with arrays) * * ENTRY: * * Handle (input) * registry handle * ValueName (input) * name of registry value to query * Index (input) * Index of value (array index) * DefaultData (input) * default value to return if registry value name does not exist * * EXIT: * registry value (DWORD) * ******************************************************************************/ DWORD GetNumValueEx( HKEY Handle, LPWSTR ValueName, DWORD Index, DWORD DefaultData ) { WCHAR Name[MAX_REGKEYWORD]; if ( Index > 0 ) swprintf( Name, L"%s%u", ValueName, Index ); else wcscpy( Name, ValueName ); return( GetNumValue( Handle, Name, DefaultData ) ); } /******************************************************************************* * * GetStringValue * * get string value from registry * * ENTRY: * * Handle (input) * registry handle * ValueName (input) * name of registry value to query * DefaultData (input) * default value to return if registry value name does not exist * pValueData (output) * pointer to buffer to store returned string * MaxValueSize (input) * max length of pValueData buffer * * EXIT: * nothing * ******************************************************************************/ LONG GetStringValue( HKEY Handle, LPWSTR ValueName, LPWSTR DefaultData, LPWSTR pValueData, DWORD MaxValueSize ) { LONG Status; DWORD ValueType; DWORD ValueSize = MaxValueSize << 1; Status = RegQueryValueEx( Handle, ValueName, NULL, &ValueType, (LPBYTE) pValueData, &ValueSize ); if ( Status != ERROR_SUCCESS || ValueSize == sizeof(UNICODE_NULL) ) { if ( DefaultData ) wcscpy( pValueData, DefaultData ); else pValueData[0] = 0; } else { if ( ValueType != REG_SZ ) { pValueData[0] = 0; return( ERROR_INVALID_DATATYPE ); } } return( ERROR_SUCCESS ); } /******************************************************************************* * * GetStringValueEx * * get string value from registry (for use with arrays) * * ENTRY: * * Handle (input) * registry handle * ValueName (input) * name of registry value to query * Index (input) * Index of value (array index) * DefaultData (input) * default value to return if registry value name does not exist * pValueData (output) * pointer to buffer to store returned string * MaxValueSize (input) * max length of pValueData buffer * * EXIT: * nothing * ******************************************************************************/ LONG GetStringValueEx( HKEY Handle, LPWSTR ValueName, DWORD Index, LPWSTR DefaultData, LPWSTR pValueData, DWORD MaxValueSize ) { WCHAR Name[MAX_REGKEYWORD]; if ( Index > 0 ) swprintf( Name, L"%s%u", ValueName, Index ); else wcscpy( Name, ValueName ); return( GetStringValue( Handle, Name, DefaultData, pValueData, MaxValueSize ) ); } /******************************************************************************* * * PdConfigU2A (UNICODE to ANSI) * * copies PDCONFIGW elements to PDCONFIGA elements * * ENTRY: * pPdConfigA (output) * points to PDCONFIGA structure to copy to * * pPdConfigW (input) * points to PDCONFIGW structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID PdConfigU2A( PPDCONFIGA pPdConfigA, PPDCONFIGW pPdConfigW ) { PdConfig2U2A( &(pPdConfigA->Create), &(pPdConfigW->Create) ); PdParamsU2A( &(pPdConfigA->Params), &(pPdConfigW->Params) ); } /******************************************************************************* * * PdConfigA2U (ANSI to UNICODE) * * copies PDCONFIGA elements to PDCONFIGW elements * * ENTRY: * pPdConfigW (output) * points to PDCONFIGW structure to copy to * * pPdConfigA (input) * points to PDCONFIGA structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID PdConfigA2U( PPDCONFIGW pPdConfigW, PPDCONFIGA pPdConfigA ) { PdConfig2A2U( &(pPdConfigW->Create), &(pPdConfigA->Create) ); PdParamsA2U( &(pPdConfigW->Params), &(pPdConfigA->Params) ); } /******************************************************************************* * * PdConfig2U2A (UNICODE to ANSI) * * copies PDCONFIG2W elements to PDCONFIG2A elements * * ENTRY: * pPdConfig2A (output) * points to PDCONFIG2A structure to copy to * * pPdConfig2W (input) * points to PDCONFIG2W structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID PdConfig2U2A( PPDCONFIG2A pPdConfig2A, PPDCONFIG2W pPdConfig2W ) { UnicodeToAnsi( pPdConfig2A->PdName, sizeof(pPdConfig2A->PdName), pPdConfig2W->PdName ); pPdConfig2A->SdClass = pPdConfig2W->SdClass; UnicodeToAnsi( pPdConfig2A->PdDLL, sizeof(pPdConfig2A->PdDLL), pPdConfig2W->PdDLL ); pPdConfig2A->PdFlag = pPdConfig2W->PdFlag; pPdConfig2A->OutBufLength = pPdConfig2W->OutBufLength; pPdConfig2A->OutBufCount = pPdConfig2W->OutBufCount; pPdConfig2A->OutBufDelay = pPdConfig2W->OutBufDelay; pPdConfig2A->InteractiveDelay = pPdConfig2W->InteractiveDelay; pPdConfig2A->PortNumber = pPdConfig2W->PortNumber; pPdConfig2A->KeepAliveTimeout = pPdConfig2W->KeepAliveTimeout; } /******************************************************************************* * * PdConfig2A2U (ANSI to UNICODE) * * copies PDCONFIG2A elements to PDCONFIG2W elements * * ENTRY: * pPdConfig2W (output) * points to PDCONFIG2W structure to copy to * * pPdConfig2A (input) * points to PDCONFIG2A structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID PdConfig2A2U( PPDCONFIG2W pPdConfig2W, PPDCONFIG2A pPdConfig2A ) { AnsiToUnicode( pPdConfig2W->PdName, sizeof(pPdConfig2W->PdName), pPdConfig2A->PdName ); pPdConfig2W->SdClass = pPdConfig2A->SdClass; AnsiToUnicode( pPdConfig2W->PdDLL, sizeof(pPdConfig2W->PdDLL), pPdConfig2A->PdDLL ); pPdConfig2W->PdFlag = pPdConfig2A->PdFlag; pPdConfig2W->OutBufLength = pPdConfig2A->OutBufLength; pPdConfig2W->OutBufCount = pPdConfig2A->OutBufCount; pPdConfig2W->OutBufDelay = pPdConfig2A->OutBufDelay; pPdConfig2W->InteractiveDelay = pPdConfig2A->InteractiveDelay; pPdConfig2W->PortNumber = pPdConfig2A->PortNumber; pPdConfig2W->KeepAliveTimeout = pPdConfig2A->KeepAliveTimeout; } /******************************************************************************* * * PdConfig3U2A (UNICODE to ANSI) * * copies PDCONFIG3W elements to PDCONFIG3A elements * * ENTRY: * pPdConfig3A (output) * points to PDCONFIG3A structure to copy to * * pPdConfig3W (input) * points to PDCONFIG3W structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID PdConfig3U2A( PPDCONFIG3A pPdConfig3A, PPDCONFIG3W pPdConfig3W ) { PdConfig2U2A( &(pPdConfig3A->Data), &(pPdConfig3W->Data) ); UnicodeToAnsi( pPdConfig3A->ServiceName, sizeof(pPdConfig3A->ServiceName), pPdConfig3W->ServiceName ); UnicodeToAnsi( pPdConfig3A->ConfigDLL, sizeof(pPdConfig3A->ConfigDLL), pPdConfig3W->ConfigDLL ); } /******************************************************************************* * * PdConfig3A2U (ANSI to UNICODE) * * copies PDCONFIG3A elements to PDCONFIG3W elements * * ENTRY: * pPdConfig3W (output) * points to PDCONFIG3W structure to copy to * * pPdConfig3A (input) * points to PDCONFIG3A structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID PdConfig3A2U( PPDCONFIG3W pPdConfig3W, PPDCONFIG3A pPdConfig3A ) { PdConfig2A2U( &(pPdConfig3W->Data), &(pPdConfig3A->Data) ); AnsiToUnicode( pPdConfig3W->ServiceName, sizeof(pPdConfig3W->ServiceName), pPdConfig3A->ServiceName ); AnsiToUnicode( pPdConfig3W->ConfigDLL, sizeof(pPdConfig3W->ConfigDLL), pPdConfig3A->ConfigDLL ); } /******************************************************************************* * * PdParamsU2A (UNICODE to ANSI) * * copies PDPARAMSW elements to PDPARAMSA elements * * ENTRY: * pPdParamsA (output) * points to PDPARAMSA structure to copy to * * pPdParamsW (input) * points to PDPARAMSW structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID PdParamsU2A( PPDPARAMSA pPdParamsA, PPDPARAMSW pPdParamsW ) { pPdParamsA->SdClass = pPdParamsW->SdClass; switch ( pPdParamsW->SdClass ) { case SdNetwork: NetworkConfigU2A( &(pPdParamsA->Network), &(pPdParamsW->Network) ); break; case SdNasi: NasiConfigU2A( &(pPdParamsA->Nasi), &(pPdParamsW->Nasi) ); break; case SdAsync: AsyncConfigU2A( &(pPdParamsA->Async), &(pPdParamsW->Async) ); break; case SdOemTransport: OemTdConfigU2A( &(pPdParamsA->OemTd), &(pPdParamsW->OemTd) ); break; } } /******************************************************************************* * * PdParamsA2U (ANSI to UNICODE) * * copies PDPARAMSA elements to PDPARAMSW elements * * ENTRY: * pPdParamsW (output) * points to PDPARAMSW structure to copy to * * pPdParamsA (input) * points to PDPARAMSA structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID PdParamsA2U( PPDPARAMSW pPdParamsW, PPDPARAMSA pPdParamsA ) { pPdParamsW->SdClass = pPdParamsA->SdClass; switch ( pPdParamsA->SdClass ) { case SdNetwork: NetworkConfigA2U( &(pPdParamsW->Network), &(pPdParamsA->Network) ); break; case SdNasi: NasiConfigA2U( &(pPdParamsW->Nasi), &(pPdParamsA->Nasi) ); break; case SdAsync: AsyncConfigA2U( &(pPdParamsW->Async), &(pPdParamsA->Async) ); break; case SdOemTransport: OemTdConfigA2U( &(pPdParamsW->OemTd), &(pPdParamsA->OemTd) ); break; } } /******************************************************************************* * * NetworkConfigU2A (UNICODE to ANSI) * * copies NETWORKCONFIGW elements to NETWORKCONFIGA elements * * ENTRY: * pNetworkConfigA (output) * points to NETWORKCONFIGA structure to copy to * * pNetworkConfigW (input) * points to NETWORKCONFIGW structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID NetworkConfigU2A( PNETWORKCONFIGA pNetworkConfigA, PNETWORKCONFIGW pNetworkConfigW ) { pNetworkConfigA->LanAdapter = pNetworkConfigW->LanAdapter; UnicodeToAnsi( pNetworkConfigA->NetworkName, sizeof(pNetworkConfigA->NetworkName), pNetworkConfigW->NetworkName ); pNetworkConfigA->Flags = pNetworkConfigW->Flags; } /******************************************************************************* * * NetworkConfigA2U (ANSI to UNICODE) * * copies NETWORKCONFIGA elements to NETWORKCONFIGW elements * * ENTRY: * pNetworkConfigW (output) * points to NETWORKCONFIGW structure to copy to * * pNetworkConfigW (input) * points to NETWORKCONFIGA structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID NetworkConfigA2U( PNETWORKCONFIGW pNetworkConfigW, PNETWORKCONFIGA pNetworkConfigA ) { pNetworkConfigW->LanAdapter = pNetworkConfigA->LanAdapter; AnsiToUnicode( pNetworkConfigW->NetworkName, sizeof(pNetworkConfigW->NetworkName), pNetworkConfigA->NetworkName ); pNetworkConfigW->Flags = pNetworkConfigA->Flags; } /******************************************************************************* * * AsyncConfigU2A (UNICODE to ANSI) * * copies ASYNCCONFIGW elements to ASYNCCONFIGA elements * * ENTRY: * pAsyncConfigA (output) * points to ASYNCCONFIGA structure to copy to * * pAsyncConfigW (input) * points to ASYNCCONFIGW structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID AsyncConfigU2A( PASYNCCONFIGA pAsyncConfigA, PASYNCCONFIGW pAsyncConfigW ) { UnicodeToAnsi( pAsyncConfigA->DeviceName, sizeof(pAsyncConfigA->DeviceName), pAsyncConfigW->DeviceName ); UnicodeToAnsi( pAsyncConfigA->ModemName, sizeof(pAsyncConfigA->ModemName), pAsyncConfigW->ModemName ); pAsyncConfigA->BaudRate = pAsyncConfigW->BaudRate; pAsyncConfigA->Parity = pAsyncConfigW->Parity; pAsyncConfigA->StopBits = pAsyncConfigW->StopBits; pAsyncConfigA->ByteSize = pAsyncConfigW->ByteSize; pAsyncConfigA->fEnableDsrSensitivity = pAsyncConfigW->fEnableDsrSensitivity; pAsyncConfigA->fConnectionDriver = pAsyncConfigW->fConnectionDriver; pAsyncConfigA->FlowControl = pAsyncConfigW->FlowControl; pAsyncConfigA->Connect = pAsyncConfigW->Connect; } /******************************************************************************* * * AsyncConfigA2U (ANSI to UNICODE) * * copies ASYNCCONFIGA elements to ASYNCCONFIGW elements * * ENTRY: * pAsyncConfigW (output) * points to ASYNCCONFIGW structure to copy to * * pAsyncConfigA (input) * points to ASYNCCONFIGA structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID AsyncConfigA2U( PASYNCCONFIGW pAsyncConfigW, PASYNCCONFIGA pAsyncConfigA ) { AnsiToUnicode( pAsyncConfigW->DeviceName, sizeof(pAsyncConfigW->DeviceName), pAsyncConfigA->DeviceName ); AnsiToUnicode( pAsyncConfigW->ModemName, sizeof(pAsyncConfigW->ModemName), pAsyncConfigA->ModemName ); pAsyncConfigW->BaudRate = pAsyncConfigA->BaudRate; pAsyncConfigW->Parity = pAsyncConfigA->Parity; pAsyncConfigW->StopBits = pAsyncConfigA->StopBits; pAsyncConfigW->ByteSize = pAsyncConfigA->ByteSize; pAsyncConfigW->fEnableDsrSensitivity = pAsyncConfigA->fEnableDsrSensitivity; pAsyncConfigW->FlowControl = pAsyncConfigA->FlowControl; pAsyncConfigW->Connect = pAsyncConfigA->Connect; } /******************************************************************************* * * NasiConfigU2A (UNICODE to ANSI) * * copies NASICONFIGW elements to NASICONFIGA elements * * ENTRY: * pNasiConfigA (output) * points to NASICONFIGA structure to copy to * * pNasiConfigW (input) * points to NASICONFIGW structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID NasiConfigU2A( PNASICONFIGA pNasiConfigA, PNASICONFIGW pNasiConfigW ) { UnicodeToAnsi( pNasiConfigA->SpecificName, sizeof(pNasiConfigA->SpecificName), pNasiConfigW->SpecificName ); UnicodeToAnsi( pNasiConfigA->UserName, sizeof(pNasiConfigA->UserName), pNasiConfigW->UserName ); UnicodeToAnsi( pNasiConfigA->PassWord, sizeof(pNasiConfigA->PassWord), pNasiConfigW->PassWord ); UnicodeToAnsi( pNasiConfigA->SessionName, sizeof(pNasiConfigA->SessionName), pNasiConfigW->SessionName ); UnicodeToAnsi( pNasiConfigA->FileServer, sizeof(pNasiConfigA->FileServer), pNasiConfigW->FileServer ); pNasiConfigA->GlobalSession = pNasiConfigW->GlobalSession; } /******************************************************************************* * * NasiConfigA2U (ANSI to UNICODE) * * copies NASICONFIGA elements to NASICONFIGW elements * * ENTRY: * pNasiConfigW (output) * points to NASICONFIGW structure to copy to * * pNasiConfigA (input) * points to NASICONFIGA structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID NasiConfigA2U( PNASICONFIGW pNasiConfigW, PNASICONFIGA pNasiConfigA ) { AnsiToUnicode( pNasiConfigW->SpecificName, sizeof(pNasiConfigW->SpecificName), pNasiConfigA->SpecificName ); AnsiToUnicode( pNasiConfigW->UserName, sizeof(pNasiConfigW->UserName), pNasiConfigA->UserName ); AnsiToUnicode( pNasiConfigW->PassWord, sizeof(pNasiConfigW->PassWord), pNasiConfigA->PassWord ); AnsiToUnicode( pNasiConfigW->SessionName, sizeof(pNasiConfigW->SessionName), pNasiConfigA->SessionName ); AnsiToUnicode( pNasiConfigW->FileServer, sizeof(pNasiConfigW->FileServer), pNasiConfigA->FileServer ); pNasiConfigW->GlobalSession = pNasiConfigA->GlobalSession; } /******************************************************************************* * * OemTdConfigU2A (UNICODE to ANSI) * * copies OEMTDCONFIGW elements to OEMTDCONFIGA elements * * ENTRY: * pOemTdConfigA (output) * points to OEMTDCONFIGA structure to copy to * * pOemTdConfigW (input) * points to OEMTDCONFIGW structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID OemTdConfigU2A( POEMTDCONFIGA pOemTdConfigA, POEMTDCONFIGW pOemTdConfigW ) { pOemTdConfigA->Adapter = pOemTdConfigW->Adapter; UnicodeToAnsi( pOemTdConfigA->DeviceName, sizeof(pOemTdConfigA->DeviceName), pOemTdConfigW->DeviceName ); pOemTdConfigA->Flags = pOemTdConfigW->Flags; } /******************************************************************************* * * OemTdConfigA2U (ANSI to Unicode) * * copies OEMTDCONFIGA elements to OEMTDCONFIGW elements * * ENTRY: * pOemTdConfigW (output) * points to OEMTDCONFIGW structure to copy to * * pOemTdConfigA (input) * points to OEMTDCONFIGA structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID OemTdConfigA2U( POEMTDCONFIGW pOemTdConfigW, POEMTDCONFIGA pOemTdConfigA ) { pOemTdConfigW->Adapter = pOemTdConfigA->Adapter; AnsiToUnicode( pOemTdConfigW->DeviceName, sizeof(pOemTdConfigW->DeviceName), pOemTdConfigA->DeviceName ); pOemTdConfigW->Flags = pOemTdConfigA->Flags; } /******************************************************************************* * * WdConfigU2A (UNICODE to ANSI) * * copies WDCONFIGW elements to WDCONFIGA elements * * ENTRY: * pWdConfigA (output) * points to WDCONFIGA structure to copy to * * pWdConfigW (input) * points to WDCONFIGW structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID WdConfigU2A( PWDCONFIGA pWdConfigA, PWDCONFIGW pWdConfigW ) { UnicodeToAnsi( pWdConfigA->WdName, sizeof(pWdConfigA->WdName), pWdConfigW->WdName ); UnicodeToAnsi( pWdConfigA->WdDLL, sizeof(pWdConfigA->WdDLL), pWdConfigW->WdDLL ); UnicodeToAnsi( pWdConfigA->WsxDLL, sizeof(pWdConfigA->WsxDLL), pWdConfigW->WsxDLL ); pWdConfigA->WdFlag = pWdConfigW->WdFlag; pWdConfigA->WdInputBufferLength = pWdConfigW->WdInputBufferLength; UnicodeToAnsi( pWdConfigA->CfgDLL, sizeof(pWdConfigA->CfgDLL), pWdConfigW->CfgDLL ); UnicodeToAnsi( pWdConfigA->WdPrefix, sizeof(pWdConfigA->WdPrefix), pWdConfigW->WdPrefix ); } /******************************************************************************* * * WdConfigA2U (ANSI to UNICODE) * * copies WDCONFIGA elements to WDCONFIGW elements * * ENTRY: * pWdConfigW (output) * points to WDCONFIGW structure to copy to * * pWdConfigA (input) * points to WDCONFIGA structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID WdConfigA2U( PWDCONFIGW pWdConfigW, PWDCONFIGA pWdConfigA ) { AnsiToUnicode( pWdConfigW->WdName, sizeof(pWdConfigW->WdName), pWdConfigA->WdName ); AnsiToUnicode( pWdConfigW->WdDLL, sizeof(pWdConfigW->WdDLL), pWdConfigA->WdDLL ); AnsiToUnicode( pWdConfigW->WsxDLL, sizeof(pWdConfigW->WsxDLL), pWdConfigA->WsxDLL ); pWdConfigW->WdFlag = pWdConfigA->WdFlag; pWdConfigW->WdInputBufferLength = pWdConfigA->WdInputBufferLength; AnsiToUnicode( pWdConfigW->CfgDLL, sizeof(pWdConfigW->CfgDLL), pWdConfigA->CfgDLL ); AnsiToUnicode( pWdConfigW->WdPrefix, sizeof(pWdConfigW->WdPrefix), pWdConfigA->WdPrefix ); } /******************************************************************************* * * CdConfigU2A (UNICODE to ANSI) * * copies CDCONFIGW elements to CDCONFIGA elements * * ENTRY: * pCdConfigA (output) * points to CDCONFIGA structure to copy to * * pCdConfigW (input) * points to CDCONFIGW structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID CdConfigU2A( PCDCONFIGA pCdConfigA, PCDCONFIGW pCdConfigW ) { pCdConfigA->CdClass = pCdConfigW->CdClass; UnicodeToAnsi( pCdConfigA->CdName, sizeof(pCdConfigA->CdName), pCdConfigW->CdName ); UnicodeToAnsi( pCdConfigA->CdDLL, sizeof(pCdConfigA->CdDLL), pCdConfigW->CdDLL ); pCdConfigA->CdFlag = pCdConfigW->CdFlag; } /******************************************************************************* * * CdConfigA2U (ANSI to UNICODE) * * copies CDCONFIGA elements to CDCONFIGW elements * * ENTRY: * pCdConfigW (output) * points to CDCONFIGW structure to copy to * * pCdConfigA (input) * points to CDCONFIGA structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID CdConfigA2U( PCDCONFIGW pCdConfigW, PCDCONFIGA pCdConfigA ) { pCdConfigW->CdClass = pCdConfigA->CdClass; AnsiToUnicode( pCdConfigW->CdName, sizeof(pCdConfigW->CdName), pCdConfigA->CdName ); AnsiToUnicode( pCdConfigW->CdDLL, sizeof(pCdConfigW->CdDLL), pCdConfigA->CdDLL ); pCdConfigW->CdFlag = pCdConfigA->CdFlag; } /******************************************************************************* * * WinStationCreateU2A (UNICODE to ANSI) * * copies WINSTATIONCREATEW elements to WINSTATIONCREATEA elements * * ENTRY: * pWinStationCreateA (output) * points to WINSTATIONCREATEA structure to copy to * * pWinStationCreateW (input) * points to WINSTATIONCREATEW structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID WinStationCreateU2A( PWINSTATIONCREATEA pWinStationCreateA, PWINSTATIONCREATEW pWinStationCreateW ) { pWinStationCreateA->fEnableWinStation = pWinStationCreateW->fEnableWinStation; pWinStationCreateA->MaxInstanceCount = pWinStationCreateW->MaxInstanceCount; } /******************************************************************************* * * WinStationCreateA2U (ANSI to UNICODE) * * copies WINSTATIONCREATEA elements to WINSTATIONCREATEW elements * * ENTRY: * pWinStationCreateW (output) * points to WINSTATIONCREATEW structure to copy to * * pWinStationCreateA (input) * points to WINSTATIONCREATEA structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID WinStationCreateA2U( PWINSTATIONCREATEW pWinStationCreateW, PWINSTATIONCREATEA pWinStationCreateA ) { pWinStationCreateW->fEnableWinStation = pWinStationCreateA->fEnableWinStation; pWinStationCreateW->MaxInstanceCount = pWinStationCreateA->MaxInstanceCount; } /******************************************************************************* * * WinStationConfigU2A (UNICODE to ANSI) * * copies WINSTATIONCONFIGW elements to WINSTATIONCONFIGA elements * * ENTRY: * pWinStationConfigA (output) * points to WINSTATIONCONFIGA structure to copy to * * pWinStationConfigW (input) * points to WINSTATIONCONFIGW structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID WinStationConfigU2A( PWINSTATIONCONFIGA pWinStationConfigA, PWINSTATIONCONFIGW pWinStationConfigW ) { UnicodeToAnsi( pWinStationConfigA->Comment, sizeof(pWinStationConfigA->Comment), pWinStationConfigW->Comment ); UserConfigU2A( &(pWinStationConfigA->User), &(pWinStationConfigW->User) ); RtlCopyMemory( pWinStationConfigA->OEMId, pWinStationConfigW->OEMId, sizeof(pWinStationConfigW->OEMId) ); } /******************************************************************************* * * WinStationConfigA2U (ANSI to UNICODE) * * copies WINSTATIONCONFIGA elements to WINSTATIONCONFIGW elements * * ENTRY: * pWinStationConfigW (output) * points to WINSTATIONCONFIGW structure to copy to * * pWinStationConfigA (input) * points to WINSTATIONCONFIGA structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID WinStationConfigA2U( PWINSTATIONCONFIGW pWinStationConfigW, PWINSTATIONCONFIGA pWinStationConfigA ) { AnsiToUnicode( pWinStationConfigW->Comment, sizeof(pWinStationConfigW->Comment), pWinStationConfigA->Comment ); UserConfigA2U( &(pWinStationConfigW->User), &(pWinStationConfigA->User) ); RtlCopyMemory( pWinStationConfigW->OEMId, pWinStationConfigA->OEMId, sizeof(pWinStationConfigA->OEMId) ); } /******************************************************************************* * * UserConfigU2A (UNICODE to ANSI) * * copies USERCONFIGW elements to USERCONFIGA elements * * ENTRY: * pUserConfigA (output) * points to USERCONFIGA structure to copy to * * pUserConfigW (input) * points to USERCONFIGW structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID UserConfigU2A( PUSERCONFIGA pUserConfigA, PUSERCONFIGW pUserConfigW ) { pUserConfigA->fInheritAutoLogon = pUserConfigW->fInheritAutoLogon; pUserConfigA->fInheritResetBroken = pUserConfigW->fInheritResetBroken; pUserConfigA->fInheritReconnectSame = pUserConfigW->fInheritReconnectSame; pUserConfigA->fInheritInitialProgram = pUserConfigW->fInheritInitialProgram; pUserConfigA->fInheritCallback = pUserConfigW->fInheritCallback; pUserConfigA->fInheritCallbackNumber = pUserConfigW->fInheritCallbackNumber; pUserConfigA->fInheritShadow = pUserConfigW->fInheritShadow; pUserConfigA->fInheritMaxSessionTime = pUserConfigW->fInheritMaxSessionTime; pUserConfigA->fInheritMaxDisconnectionTime = pUserConfigW->fInheritMaxDisconnectionTime; pUserConfigA->fInheritMaxIdleTime = pUserConfigW->fInheritMaxIdleTime; pUserConfigA->fInheritAutoClient = pUserConfigW->fInheritAutoClient; pUserConfigA->fInheritSecurity = pUserConfigW->fInheritSecurity; pUserConfigA->fPromptForPassword = pUserConfigW->fPromptForPassword; pUserConfigA->fResetBroken = pUserConfigW->fResetBroken; pUserConfigA->fReconnectSame = pUserConfigW->fReconnectSame; pUserConfigA->fLogonDisabled = pUserConfigW->fLogonDisabled; pUserConfigA->fWallPaperDisabled = pUserConfigW->fWallPaperDisabled; pUserConfigA->fAutoClientDrives = pUserConfigW->fAutoClientDrives; pUserConfigA->fAutoClientLpts = pUserConfigW->fAutoClientLpts; pUserConfigA->fForceClientLptDef = pUserConfigW->fForceClientLptDef; pUserConfigA->fDisableEncryption = pUserConfigW->fDisableEncryption; pUserConfigA->fHomeDirectoryMapRoot = pUserConfigW->fHomeDirectoryMapRoot; pUserConfigA->fUseDefaultGina = pUserConfigW->fUseDefaultGina; pUserConfigA->fCursorBlinkDisabled = pUserConfigW->fCursorBlinkDisabled; pUserConfigA->fDisableCpm = pUserConfigW->fDisableCpm; pUserConfigA->fDisableCdm = pUserConfigW->fDisableCdm; pUserConfigA->fDisableCcm = pUserConfigW->fDisableCcm; pUserConfigA->fDisableLPT = pUserConfigW->fDisableLPT; pUserConfigA->fDisableClip = pUserConfigW->fDisableClip; pUserConfigA->fDisableExe = pUserConfigW->fDisableExe; pUserConfigA->fDisableCam = pUserConfigW->fDisableCam; UnicodeToAnsi( pUserConfigA->UserName, sizeof(pUserConfigA->UserName), pUserConfigW->UserName ); UnicodeToAnsi( pUserConfigA->Domain, sizeof(pUserConfigA->Domain), pUserConfigW->Domain ); UnicodeToAnsi( pUserConfigA->Password, sizeof(pUserConfigA->Password), pUserConfigW->Password ); UnicodeToAnsi( pUserConfigA->WorkDirectory, sizeof(pUserConfigA->WorkDirectory), pUserConfigW->WorkDirectory ); UnicodeToAnsi( pUserConfigA->InitialProgram, sizeof(pUserConfigA->InitialProgram), pUserConfigW->InitialProgram ); UnicodeToAnsi( pUserConfigA->CallbackNumber, sizeof(pUserConfigA->CallbackNumber), pUserConfigW->CallbackNumber ); pUserConfigA->Callback = pUserConfigW->Callback; pUserConfigA->Shadow = pUserConfigW->Shadow; pUserConfigA->MaxConnectionTime = pUserConfigW->MaxConnectionTime; pUserConfigA->MaxDisconnectionTime = pUserConfigW->MaxDisconnectionTime; pUserConfigA->MaxIdleTime = pUserConfigW->MaxIdleTime; pUserConfigA->KeyboardLayout = pUserConfigW->KeyboardLayout; pUserConfigA->MinEncryptionLevel = pUserConfigW->MinEncryptionLevel; UnicodeToAnsi( pUserConfigA->WFProfilePath, sizeof(pUserConfigA->WFProfilePath), pUserConfigW->WFProfilePath ); UnicodeToAnsi( pUserConfigA->WFHomeDir, sizeof(pUserConfigA->WFHomeDir), pUserConfigW->WFHomeDir ); UnicodeToAnsi( pUserConfigA->WFHomeDirDrive, sizeof(pUserConfigA->WFHomeDirDrive), pUserConfigW->WFHomeDirDrive ); } /******************************************************************************* * * UserConfigA2U (ANSI to UNICODE) * * copies USERCONFIGA elements to USERCONFIGW elements * * ENTRY: * pUserConfigW (output) * points to USERCONFIGW structure to copy to * * pUserConfigA (input) * points to USERCONFIGA structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID UserConfigA2U( PUSERCONFIGW pUserConfigW, PUSERCONFIGA pUserConfigA ) { pUserConfigW->fInheritAutoLogon = pUserConfigA->fInheritAutoLogon; pUserConfigW->fInheritResetBroken = pUserConfigA->fInheritResetBroken; pUserConfigW->fInheritReconnectSame = pUserConfigA->fInheritReconnectSame; pUserConfigW->fInheritInitialProgram = pUserConfigA->fInheritInitialProgram; pUserConfigW->fInheritCallback = pUserConfigA->fInheritCallback; pUserConfigW->fInheritCallbackNumber = pUserConfigA->fInheritCallbackNumber; pUserConfigW->fInheritShadow = pUserConfigA->fInheritShadow; pUserConfigW->fInheritMaxSessionTime = pUserConfigA->fInheritMaxSessionTime; pUserConfigW->fInheritMaxDisconnectionTime = pUserConfigA->fInheritMaxDisconnectionTime; pUserConfigW->fInheritMaxIdleTime = pUserConfigA->fInheritMaxIdleTime; pUserConfigW->fInheritAutoClient = pUserConfigA->fInheritAutoClient; pUserConfigW->fInheritSecurity = pUserConfigA->fInheritSecurity; pUserConfigW->fPromptForPassword = pUserConfigA->fPromptForPassword; pUserConfigW->fResetBroken = pUserConfigA->fResetBroken; pUserConfigW->fReconnectSame = pUserConfigA->fReconnectSame; pUserConfigW->fLogonDisabled = pUserConfigA->fLogonDisabled; pUserConfigW->fWallPaperDisabled = pUserConfigA->fWallPaperDisabled; pUserConfigW->fAutoClientDrives = pUserConfigA->fAutoClientDrives; pUserConfigW->fAutoClientLpts = pUserConfigA->fAutoClientLpts; pUserConfigW->fForceClientLptDef = pUserConfigA->fForceClientLptDef; pUserConfigW->fDisableEncryption = pUserConfigA->fDisableEncryption; pUserConfigW->fHomeDirectoryMapRoot = pUserConfigA->fHomeDirectoryMapRoot; pUserConfigW->fUseDefaultGina = pUserConfigA->fUseDefaultGina; pUserConfigW->fCursorBlinkDisabled = pUserConfigA->fCursorBlinkDisabled; pUserConfigW->fDisableCpm = pUserConfigA->fDisableCpm; pUserConfigW->fDisableCdm = pUserConfigA->fDisableCdm; pUserConfigW->fDisableCcm = pUserConfigA->fDisableCcm; pUserConfigW->fDisableLPT = pUserConfigA->fDisableLPT; pUserConfigW->fDisableClip = pUserConfigA->fDisableClip; pUserConfigW->fDisableExe = pUserConfigA->fDisableExe; pUserConfigW->fDisableCam = pUserConfigA->fDisableCam; AnsiToUnicode( pUserConfigW->UserName, sizeof(pUserConfigW->UserName), pUserConfigA->UserName ); AnsiToUnicode( pUserConfigW->Domain, sizeof(pUserConfigW->Domain), pUserConfigA->Domain ); AnsiToUnicode( pUserConfigW->Password, sizeof(pUserConfigW->Password), pUserConfigA->Password ); AnsiToUnicode( pUserConfigW->WorkDirectory, sizeof(pUserConfigW->WorkDirectory), pUserConfigA->WorkDirectory ); AnsiToUnicode( pUserConfigW->InitialProgram, sizeof(pUserConfigW->InitialProgram), pUserConfigA->InitialProgram ); AnsiToUnicode( pUserConfigW->CallbackNumber, sizeof(pUserConfigW->CallbackNumber), pUserConfigA->CallbackNumber ); pUserConfigW->Callback = pUserConfigA->Callback; pUserConfigW->Shadow = pUserConfigA->Shadow; pUserConfigW->MaxConnectionTime = pUserConfigA->MaxConnectionTime; pUserConfigW->MaxDisconnectionTime = pUserConfigA->MaxDisconnectionTime; pUserConfigW->MaxIdleTime = pUserConfigA->MaxIdleTime; pUserConfigW->KeyboardLayout = pUserConfigA->KeyboardLayout; pUserConfigW->MinEncryptionLevel = pUserConfigA->MinEncryptionLevel; AnsiToUnicode( pUserConfigW->WFProfilePath, sizeof(pUserConfigW->WFProfilePath), pUserConfigA->WFProfilePath ); AnsiToUnicode( pUserConfigW->WFHomeDir, sizeof(pUserConfigW->WFHomeDir), pUserConfigA->WFHomeDir ); AnsiToUnicode( pUserConfigW->WFHomeDirDrive, sizeof(pUserConfigW->WFHomeDirDrive), pUserConfigA->WFHomeDirDrive ); } /******************************************************************************* * * WinStationPrinterU2A (UNICODE to ANSI) * * copies WINSTATIONPRINTERW elements to WINSTATIONPRINTERA elements * * ENTRY: * pWinStationPrinterA (output) * points to WINSTATIONPRINTERA structure to copy to * * pWinStationPrinterW (input) * points to WINSTATIONPRINTERW structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID WinStationPrinterU2A( PWINSTATIONPRINTERA pWinStationPrinterA, PWINSTATIONPRINTERW pWinStationPrinterW ) { UnicodeToAnsi( pWinStationPrinterA->Lpt1, sizeof(pWinStationPrinterA->Lpt1), pWinStationPrinterW->Lpt1 ); UnicodeToAnsi( pWinStationPrinterA->Lpt2, sizeof(pWinStationPrinterA->Lpt2), pWinStationPrinterW->Lpt2 ); UnicodeToAnsi( pWinStationPrinterA->Lpt3, sizeof(pWinStationPrinterA->Lpt3), pWinStationPrinterW->Lpt3 ); UnicodeToAnsi( pWinStationPrinterA->Lpt4, sizeof(pWinStationPrinterA->Lpt4), pWinStationPrinterW->Lpt4 ); } /******************************************************************************* * * WinStationPrinterA2U (ANSI to UNICODE) * * copies WINSTATIONPRINTERA elements to WINSTATIONPRINTERW elements * * ENTRY: * pWinStationPrinterW (output) * points to WINSTATIONPRINTERW structure to copy to * * pWinStationPrinterA (input) * points to WINSTATIONPRINTERA structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID WinStationPrinterA2U( PWINSTATIONPRINTERW pWinStationPrinterW, PWINSTATIONPRINTERA pWinStationPrinterA ) { AnsiToUnicode( pWinStationPrinterW->Lpt1, sizeof(pWinStationPrinterW->Lpt1), pWinStationPrinterA->Lpt1 ); AnsiToUnicode( pWinStationPrinterW->Lpt2, sizeof(pWinStationPrinterW->Lpt2), pWinStationPrinterA->Lpt2 ); AnsiToUnicode( pWinStationPrinterW->Lpt3, sizeof(pWinStationPrinterW->Lpt3), pWinStationPrinterA->Lpt3 ); AnsiToUnicode( pWinStationPrinterW->Lpt4, sizeof(pWinStationPrinterW->Lpt4), pWinStationPrinterA->Lpt4 ); } /******************************************************************************* * * WinStationInformationU2A (UNICODE to ANSI) * * copies WINSTATIONINFORMATIONW elements to WINSTATIONINFORMATIONA elements * * ENTRY: * pWinStationInformationA (output) * points to WINSTATIONINFORMATIONA structure to copy to * * pWinStationInformationW (input) * points to WINSTATIONINFORMATIONW structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID WinStationInformationU2A( PWINSTATIONINFORMATIONA pWinStationInformationA, PWINSTATIONINFORMATIONW pWinStationInformationW ) { pWinStationInformationA->ConnectState = pWinStationInformationW->ConnectState; UnicodeToAnsi( pWinStationInformationA->WinStationName, sizeof(pWinStationInformationA->WinStationName), pWinStationInformationW->WinStationName ); pWinStationInformationA->LogonId = pWinStationInformationW->LogonId; pWinStationInformationA->ConnectTime = pWinStationInformationW->ConnectTime; pWinStationInformationA->DisconnectTime = pWinStationInformationW->DisconnectTime; pWinStationInformationA->LastInputTime = pWinStationInformationW->LastInputTime; pWinStationInformationA->LogonTime = pWinStationInformationW->LogonTime; pWinStationInformationA->Status = pWinStationInformationW->Status; UnicodeToAnsi( pWinStationInformationA->Domain, sizeof(pWinStationInformationA->Domain), pWinStationInformationW->Domain ); UnicodeToAnsi( pWinStationInformationA->UserName, sizeof(pWinStationInformationA->UserName), pWinStationInformationW->UserName ); } /******************************************************************************* * * WinStationInformationA2U (ANSI to UNICODE) * * copies WINSTATIONINFORMATIONA elements to WINSTATIONINFORMATIONW elements * * ENTRY: * pWinStationInformationW (output) * points to WINSTATIONINFORMATIONW structure to copy to * * pWinStationInformationA (input) * points to WINSTATIONINFORMATIONA structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID WinStationInformationA2U( PWINSTATIONINFORMATIONW pWinStationInformationW, PWINSTATIONINFORMATIONA pWinStationInformationA ) { pWinStationInformationW->ConnectState = pWinStationInformationA->ConnectState; AnsiToUnicode( pWinStationInformationW->WinStationName, sizeof(pWinStationInformationW->WinStationName), pWinStationInformationA->WinStationName ); pWinStationInformationW->LogonId = pWinStationInformationA->LogonId; pWinStationInformationW->ConnectTime = pWinStationInformationA->ConnectTime; pWinStationInformationW->DisconnectTime = pWinStationInformationA->DisconnectTime; pWinStationInformationW->LastInputTime = pWinStationInformationA->LastInputTime; pWinStationInformationW->LogonTime = pWinStationInformationA->LogonTime; pWinStationInformationW->Status = pWinStationInformationA->Status; AnsiToUnicode( pWinStationInformationW->Domain, sizeof(pWinStationInformationW->Domain), pWinStationInformationA->Domain ); AnsiToUnicode( pWinStationInformationW->UserName, sizeof(pWinStationInformationW->UserName), pWinStationInformationA->UserName ); } /******************************************************************************* * * WinStationClientU2A (UNICODE to ANSI) * * copies WINSTATIONCLIENTW elements to WINSTATIONCLIENTA elements * * ENTRY: * pWinStationClientA (output) * points to WINSTATIONCLIENTA structure to copy to * * pWinStationClientW (input) * points to WINSTATIONCLIENTW structure to copy from * * EXIT: * nothing (VOID) * ******************************************************************************/ VOID WinStationClientU2A( PWINSTATIONCLIENTA pWinStationClientA, PWINSTATIONCLIENTW pWinStationClientW ) { pWinStationClientA->fTextOnly = pWinStationClientW->fTextOnly; pWinStationClientA->fDisableCtrlAltDel = pWinStationClientW->fDisableCtrlAltDel; UnicodeToAnsi( pWinStationClientA->ClientName, sizeof(pWinStationClientA->ClientName), pWinStationClientW->ClientName ); UnicodeToAnsi( pWinStationClientA->Domain, sizeof(pWinStationClientA->Domain), pWinStationClientW->Domain ); UnicodeToAnsi( pWinStationClientA->UserName, sizeof(pWinStationClientA->UserName), pWinStationClientW->UserName ); UnicodeToAnsi( pWinStationClientA->Password, sizeof(pWinStationClientA->Password), pWinStationClientW->Password ); UnicodeToAnsi( pWinStationClientA->WorkDirectory, sizeof(pWinStationClientA->WorkDirectory), pWinStationClientW->WorkDirectory ); UnicodeToAnsi( pWinStationClientA->InitialProgram, sizeof(pWinStationClientA->InitialProgram), pWinStationClientW->InitialProgram ); UnicodeToAnsi( pWinStationClientA->clientDigProductId, sizeof( pWinStationClientA->clientDigProductId), pWinStationClientW->clientDigProductId ); pWinStationClientA->SerialNumber = pWinStationClientW->SerialNumber; pWinStationClientA->EncryptionLevel = pWinStationClientW->EncryptionLevel; UnicodeToAnsi( pWinStationClientA->ClientAddress, sizeof(pWinStationClientA->ClientAddress), pWinStationClientW->ClientAddress); pWinStationClientA->HRes = pWinStationClientW->HRes; pWinStationClientA->VRes = pWinStationClientW->VRes; pWinStationClientA->ColorDepth = pWinStationClientW->ColorDepth; pWinStationClientA->ProtocolType = pWinStationClientW->ProtocolType; pWinStationClientA->KeyboardLayout = pWinStationClientW->KeyboardLayout; UnicodeToAnsi( pWinStationClientA->ClientDirectory, sizeof(pWinStationClientA->ClientDirectory), pWinStationClientW->ClientDirectory); UnicodeToAnsi( pWinStationClientA->ClientLicense, sizeof(pWinStationClientA->ClientLicense), pWinStationClientW->ClientLicense); UnicodeToAnsi( pWinStationClientA->ClientModem, sizeof(pWinStationClientA->ClientModem), pWinStationClientW->ClientModem); pWinStationClientA->ClientBuildNumber = pWinStationClientW->ClientBuildNumber; pWinStationClientA->ClientHardwareId = pWinStationClientW->ClientHardwareId; pWinStationClientA->ClientProductId = pWinStationClientW->ClientProductId; pWinStationClientA->OutBufCountHost = pWinStationClientW->OutBufCountHost; pWinStationClientA->OutBufCountClient = pWinStationClientW->OutBufCountClient; pWinStationClientA->OutBufLength = pWinStationClientW->OutBufLength; } VOID WinStationProductIdU2A( PWINSTATIONPRODIDA pWinStationProdIdA, PWINSTATIONPRODIDW pWinStationProdIdW) { UnicodeToAnsi( pWinStationProdIdA->DigProductId, sizeof(pWinStationProdIdA->DigProductId), pWinStationProdIdW->DigProductId); UnicodeToAnsi( pWinStationProdIdA->ClientDigProductId, sizeof(pWinStationProdIdA->ClientDigProductId), pWinStationProdIdW->ClientDigProductId); UnicodeToAnsi( pWinStationProdIdA->OuterMostDigProductId, sizeof(pWinStationProdIdA->OuterMostDigProductId), pWinStationProdIdW->OuterMostDigProductId); pWinStationProdIdA->curentSessionId = pWinStationProdIdW->curentSessionId; pWinStationProdIdA->ClientSessionId = pWinStationProdIdW->ClientSessionId; pWinStationProdIdA->OuterMostSessionId = pWinStationProdIdW->OuterMostSessionId; }