diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a62f207
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/cpp/wiipair/.settings
diff --git a/cpp/Wiipair/.cproject b/cpp/Wiipair/.cproject
deleted file mode 100644
index 1d598c5..0000000
--- a/cpp/Wiipair/.cproject
+++ /dev/null
@@ -1,153 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/cpp/Wiipair/.project b/cpp/Wiipair/.project
deleted file mode 100644
index 27bf4e7..0000000
--- a/cpp/Wiipair/.project
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
- Wiipair
-
-
-
-
-
- org.eclipse.cdt.managedbuilder.core.genmakebuilder
- clean,full,incremental,
-
-
- ?name?
-
-
-
- org.eclipse.cdt.make.core.append_environment
- true
-
-
- org.eclipse.cdt.make.core.buildArguments
-
-
-
- org.eclipse.cdt.make.core.buildCommand
- make
-
-
- org.eclipse.cdt.make.core.buildLocation
- ${workspace_loc:/Wiiscan/Release}
-
-
- org.eclipse.cdt.make.core.contents
- org.eclipse.cdt.make.core.activeConfigSettings
-
-
- org.eclipse.cdt.make.core.enableAutoBuild
- false
-
-
- org.eclipse.cdt.make.core.enableCleanBuild
- true
-
-
- org.eclipse.cdt.make.core.enableFullBuild
- true
-
-
- org.eclipse.cdt.make.core.stopOnError
- true
-
-
- org.eclipse.cdt.make.core.useDefaultBuildCmd
- true
-
-
-
-
- org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
- full,incremental,
-
-
-
-
-
- org.eclipse.cdt.core.cnature
- org.eclipse.cdt.core.ccnature
- org.eclipse.cdt.managedbuilder.core.managedBuildNature
- org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
-
-
diff --git a/cpp/Wiipair/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/cpp/Wiipair/.settings/org.eclipse.cdt.managedbuilder.core.prefs
deleted file mode 100644
index 31dfb57..0000000
--- a/cpp/Wiipair/.settings/org.eclipse.cdt.managedbuilder.core.prefs
+++ /dev/null
@@ -1,25 +0,0 @@
-eclipse.preferences.version=1
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1313294112/CPATH/delimiter=;
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1313294112/CPATH/operation=remove
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1313294112/CPLUS_INCLUDE_PATH/delimiter=;
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1313294112/CPLUS_INCLUDE_PATH/operation=remove
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1313294112/C_INCLUDE_PATH/delimiter=;
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1313294112/C_INCLUDE_PATH/operation=remove
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1313294112/append=true
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1313294112/appendContributed=true
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/CPATH/delimiter=;
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/CPATH/operation=remove
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/CPLUS_INCLUDE_PATH/delimiter=;
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/CPLUS_INCLUDE_PATH/operation=remove
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/C_INCLUDE_PATH/delimiter=;
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/C_INCLUDE_PATH/operation=remove
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/append=true
-environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/appendContributed=true
-environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1313294112/LIBRARY_PATH/delimiter=;
-environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1313294112/LIBRARY_PATH/operation=remove
-environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1313294112/append=true
-environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1313294112/appendContributed=true
-environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/LIBRARY_PATH/delimiter=;
-environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/LIBRARY_PATH/operation=remove
-environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/append=true
-environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/appendContributed=true
diff --git a/cpp/Wiipair/Debug/wiipair.exe b/cpp/Wiipair/Debug/wiipair.exe
deleted file mode 100644
index d8002b3..0000000
Binary files a/cpp/Wiipair/Debug/wiipair.exe and /dev/null differ
diff --git a/cpp/Wiipair/Release/wiipair.exe b/cpp/Wiipair/Release/wiipair.exe
deleted file mode 100644
index 2442cc2..0000000
Binary files a/cpp/Wiipair/Release/wiipair.exe and /dev/null differ
diff --git a/cpp/Wiipair/include/BluetoothAPIs.h b/cpp/Wiipair/include/BluetoothAPIs.h
deleted file mode 100644
index 39ef8eb..0000000
--- a/cpp/Wiipair/include/BluetoothAPIs.h
+++ /dev/null
@@ -1,1540 +0,0 @@
-
-//
-// Copyright 2002 - Microsoft Corporation
-//
-// Created By:
-// Geoff Pease (GPease) 12-JAN-2002
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#pragma once
-
-#define BLUETOOTH_MAX_NAME_SIZE (248)
-#define BLUETOOTH_MAX_PASSKEY_SIZE (16)
-#define BLUETOOTH_MAX_PASSKEY_BUFFER_SIZE (BLUETOOTH_MAX_PASSKEY_SIZE + 1)
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// ***************************************************************************
-//
-// Bluetooth Address
-//
-// ***************************************************************************
-
-typedef ULONGLONG BTH_ADDR;
-
-typedef struct _BLUETOOTH_ADDRESS {
- union {
- BTH_ADDR ullLong; // easier to compare again BLUETOOTH_NULL_ADDRESS
- BYTE rgBytes[ 6 ]; // easier to format when broken out
- };
-
-} BLUETOOTH_ADDRESS_STRUCT;
-
-#define BLUETOOTH_ADDRESS BLUETOOTH_ADDRESS_STRUCT
-
-#define BLUETOOTH_NULL_ADDRESS ( (ULONGLONG) 0x0 )
-
-// ***************************************************************************
-//
-// Radio Enumeration
-//
-// Description:
-// This group of APIs enumerates the installed Bluetooth radios.
-//
-// Sample Usage:
-// HANDLE hRadio;
-// BLUETOOTH_FIND_RADIO_PARAMS btfrp = { sizeof(btfrp) };
-//
-// HBLUETOOTH_RADIO_FIND hFind = BluetoothFindFirstRadio( &btfrp, &hRadio );
-// if ( NULL != hFind )
-// {
-// do
-// {
-// //
-// // TODO: Do something with the radio handle.
-// //
-//
-// CloseHandle( hRadio );
-//
-// } while( BluetoothFindNextRadio( hFind, &hRadio ) );
-//
-// BluetoothFindRadioClose( hFind );
-// }
-//
-// ***************************************************************************
-
-typedef struct _BLUETOOTH_FIND_RADIO_PARAMS {
- DWORD dwSize; // IN sizeof this structure
-
-} BLUETOOTH_FIND_RADIO_PARAMS;
-
-typedef HANDLE HBLUETOOTH_RADIO_FIND;
-
-//
-// Description:
-// Begins the enumeration of local Bluetooth radios.
-//
-// Parameters:
-// pbtfrp
-// A pointer to a BLUETOOTH_FIND_RADIO_PARAMS structure. The dwSize
-// member of this structure must match the sizeof the of the structure.
-//
-// phRadio
-// A pointer where the first radio HANDLE enumerated will be returned.
-//
-// Return Values:
-// NULL
-// Error opening radios or no devices found. Use GetLastError() for
-// more info.
-//
-// ERROR_INVALID_PARAMETER
-// pbtfrp parameter is NULL.
-//
-// ERROR_REVISION_MISMATCH
-// The pbtfrp structure is not the right length.
-//
-// ERROR_OUTOFMEMORY
-// Out of memory.
-//
-// other Win32 errors.
-//
-// any other
-// Success. The return handle is valid and phRadio points to a valid handle.
-//
-HBLUETOOTH_RADIO_FIND
-WINAPI
-BluetoothFindFirstRadio(
- BLUETOOTH_FIND_RADIO_PARAMS * pbtfrp,
- HANDLE * phRadio
- );
-
-//
-// Description:
-// Finds the next installed Bluetooth radio.
-//
-// Parameters:
-// hFind
-// The handle returned by BluetoothFindFirstRadio().
-//
-// phRadio
-// A pointer where the next radio HANDLE enumerated will be returned.
-//
-// Return Values:
-// TRUE
-// Next device succesfully found. pHandleOut points to valid handle.
-//
-// FALSE
-// No device found. pHandleOut points to an invalid handle. Call
-// GetLastError() for more details.
-//
-// ERROR_INVALID_HANDLE
-// The handle is NULL.
-//
-// ERROR_NO_MORE_ITEMS
-// No more radios found.
-//
-// ERROR_OUTOFMEMORY
-// Out of memory.
-//
-// other Win32 errors
-//
-BOOL
-WINAPI
-BluetoothFindNextRadio(
- HBLUETOOTH_RADIO_FIND hFind,
- HANDLE * phRadio
- );
-
-//
-// Description:
-// Closes the enumeration handle.
-//
-// Parameters
-// hFind
-// The handle returned by BluetoothFindFirstRadio().
-//
-// Return Values:
-// TRUE
-// Handle succesfully closed.
-//
-// FALSE
-// Failure. Check GetLastError() for details.
-//
-// ERROR_INVALID_HANDLE
-// The handle is NULL.
-//
-BOOL
-WINAPI
-BluetoothFindRadioClose(
- HBLUETOOTH_RADIO_FIND hFind
- );
-
-// ***************************************************************************
-//
-// Radio Information
-//
-// ***************************************************************************
-
-typedef struct _BLUETOOTH_RADIO_INFO {
- DWORD dwSize; // Size, in bytes, of this entire data structure
-
- BLUETOOTH_ADDRESS address; // Address of the local radio
-
- WCHAR szName[ BLUETOOTH_MAX_NAME_SIZE ]; // Name of the local radio
-
- ULONG ulClassofDevice; // Class of device for the local radio
-
- USHORT lmpSubversion; // lmpSubversion, manufacturer specifc.
- USHORT manufacturer; // Manufacturer of the radio, BTH_MFG_Xxx value. For the most up to date
- // list, goto the Bluetooth specification website and get the Bluetooth
- // assigned numbers document.
-} BLUETOOTH_RADIO_INFO, *PBLUETOOTH_RADIO_INFO;
-
-//
-// Description:
-// Retrieves the information about the radio represented by the handle.
-//
-// Parameters:
-// hRadio
-// Handle to a local radio retrieved through BluetoothFindFirstRadio()
-// et al or SetupDiEnumerateDeviceInterfaces()
-//
-// pRadioInfo
-// Radio information to be filled in. The dwSize member must match the
-// size of the structure.
-//
-// Return Values:
-// ERROR_SUCCESS
-// The information was retrieved successfully.
-//
-// ERROR_INVALID_PARAMETER
-// pRadioInfo or hRadio is NULL.
-//
-// ERROR_REVISION_MISMATCH
-// pRadioInfo->dwSize is invalid.
-//
-// other Win32 error codes.
-//
-DWORD
-WINAPI
-BluetoothGetRadioInfo(
- HANDLE hRadio,
- PBLUETOOTH_RADIO_INFO pRadioInfo
- );
-
-// ***************************************************************************
-//
-// Device Information Stuctures
-//
-// ***************************************************************************
-
-typedef struct _BLUETOOTH_DEVICE_INFO {
- DWORD dwSize; // size, in bytes, of this structure - must be the sizeof(BLUETOOTH_DEVICE_INFO)
-
- BLUETOOTH_ADDRESS Address; // Bluetooth address
-
- ULONG ulClassofDevice; // Bluetooth "Class of Device"
-
- BOOL fConnected; // Device connected/in use
- BOOL fRemembered; // Device remembered
- BOOL fAuthenticated; // Device authenticated/paired/bonded
-
- SYSTEMTIME stLastSeen; // Last time the device was seen
- SYSTEMTIME stLastUsed; // Last time the device was used for other than RNR, inquiry, or SDP
-
- WCHAR szName[ BLUETOOTH_MAX_NAME_SIZE ]; // Name of the device
-
-} BLUETOOTH_DEVICE_INFO_STRUCT;
-
-#define BLUETOOTH_DEVICE_INFO BLUETOOTH_DEVICE_INFO_STRUCT
-
-typedef BLUETOOTH_DEVICE_INFO * PBLUETOOTH_DEVICE_INFO;
-
-// ***************************************************************************
-//
-// Device Enumeration
-//
-// Description:
-// Enumerates the Bluetooth devices. The types of returned device depends
-// on the flags set in the BLUETOOTH_DEVICE_SEARCH_PARAMS (see structure
-// definition for details).
-//
-// Sample Usage:
-// HBLUETOOTH_DEVICE_FIND hFind;
-// BLUETOOTH_DEVICE_SEARCH_PARAMS btsp = { sizeof(btsp) };
-// BLUETOOTH_DEVICE_INFO btdi = { sizeof(btdi) };
-//
-// btsp.fReturnAuthenticated = TRUE;
-// btsp.fReturnRemembered = TRUE;
-//
-// hFind = BluetoothFindFirstDevice( &btsp, &btdi );
-// if ( NULL != hFind )
-// {
-// do
-// {
-// //
-// // TODO: Do something useful with the device info.
-// //
-//
-// } while( BluetoothFindNextDevice( hFind, &btdi ) );
-//
-// BluetoothFindDeviceClose( hFind );
-// }
-//
-// ***************************************************************************
-
-typedef struct _BLUETOOTH_DEVICE_SEARCH_PARAMS {
- DWORD dwSize; // IN sizeof this structure
-
- BOOL fReturnAuthenticated; // IN return authenticated devices
- BOOL fReturnRemembered; // IN return remembered devices
- BOOL fReturnUnknown; // IN return unknown devices
- BOOL fReturnConnected; // IN return connected devices
-
- BOOL fIssueInquiry; // IN issue a new inquiry
- UCHAR cTimeoutMultiplier; // IN timeout for the inquiry
-
- HANDLE hRadio; // IN handle to radio to enumerate - NULL == all radios will be searched
-
-} BLUETOOTH_DEVICE_SEARCH_PARAMS;
-
-typedef HANDLE HBLUETOOTH_DEVICE_FIND;
-
-//
-// Description:
-// Begins the enumeration of Bluetooth devices.
-//
-// Parameters:
-// pbtsp
-// A pointer to a BLUETOOTH_DEVICE_SEARCH_PARAMS structure. This
-// structure contains the flags and inputs used to conduct the search.
-// See BLUETOOTH_DEVICE_SEARCH_PARAMS for details.
-//
-// pbtdi
-// A pointer to a BLUETOOTH_DEVICE_INFO structure to return information
-// about the first Bluetooth device found. Note that the dwSize member
-// of the structure must be the sizeof(BLUETOOTH_DEVICE_INFO) before
-// calling because the APIs hast to know the size of the buffer being
-// past in. The dwSize member must also match the exact
-// sizeof(BLUETOOTH_DEVICE_INFO) or the call will fail.
-//
-// Return Values:
-// NULL
-// Error opening radios or not devices found. Use GetLastError for more info.
-//
-// ERROR_INVALID_PARAMETER
-// pbtsp parameter or pbtdi parameter is NULL.
-//
-// ERROR_REVISION_MISMATCH
-// The pbtfrp structure is not the right length.
-//
-// other Win32 errors
-//
-// any other value
-// Success. The return handle is valid and pbtdi points to valid data.
-//
-HBLUETOOTH_DEVICE_FIND
-WINAPI
-BluetoothFindFirstDevice(
- BLUETOOTH_DEVICE_SEARCH_PARAMS * pbtsp,
- BLUETOOTH_DEVICE_INFO * pbtdi
- );
-
-//
-// Description:
-// Finds the next Bluetooth device in the enumeration.
-//
-// Parameters:
-// hFind
-// The handle returned from BluetoothFindFirstDevice().
-//
-// pbtdi
-// A pointer to a BLUETOOTH_DEVICE_INFO structure to return information
-// about the first Bluetooth device found. Note that the dwSize member
-// of the structure must be the sizeof(BLUETOOTH_DEVICE_INFO) before
-// calling because the APIs hast to know the size of the buffer being
-// past in. The dwSize member must also match the exact
-// sizeof(BLUETOOTH_DEVICE_INFO) or the call will fail.
-//
-// Return Values:
-// TRUE
-// Next device succesfully found. pHandleOut points to valid handle.
-//
-// FALSE
-// No device found. pHandleOut points to an invalid handle. Call
-// GetLastError() for more details.
-//
-// ERROR_INVALID_HANDLE
-// The handle is NULL.
-//
-// ERROR_NO_MORE_ITEMS
-// No more radios found.
-//
-// ERROR_OUTOFMEMORY
-// Out of memory.
-//
-// other Win32 errors
-//
-BOOL
-WINAPI
-BluetoothFindNextDevice(
- HBLUETOOTH_DEVICE_FIND hFind,
- BLUETOOTH_DEVICE_INFO * pbtdi
- );
-
-//
-// Description:
-// Closes the enumeration handle.
-//
-// Parameters:
-// hFind
-// The handle returned from BluetoothFindFirstDevice().
-//
-// Return Values:
-// TRUE
-// Handle succesfully closed.
-//
-// FALSE
-// Failure. Check GetLastError() for details.
-//
-// ERROR_INVALID_HANDLE
-// The handle is NULL.
-//
-BOOL
-WINAPI
-BluetoothFindDeviceClose(
- HBLUETOOTH_DEVICE_FIND hFind
- );
-
-//
-// Description:
-// Retrieves information about a remote device.
-//
-// Fill in the dwSize and the Address members of the pbtdi structure
-// being passed in. On success, the rest of the members will be filled
-// out with the information that the system knows.
-//
-// Parameters:
-// hRadio
-// Handle to a local radio retrieved through BluetoothFindFirstRadio()
-// et al or SetupDiEnumerateDeviceInterfaces()
-//
-// pbtdi
-// A pointer to a BLUETOOTH_DEVICE_INFO structure to return information
-// about the first Bluetooth device found. The dwSize member of the
-// structure must be the sizeof the structure in bytes. The Address
-// member must be filled out with the Bluetooth address of the remote
-// device.
-//
-// Return Values:
-// ERROR_SUCCESS
-// Success. Information returned.
-//
-// ERROR_REVISION_MISMATCH
-// The size of the BLUETOOTH_DEVICE_INFO isn't compatible. Check
-// the dwSize member of the BLUETOOTH_DEVICE_INFO structure you
-// passed in.
-//
-// ERROR_NOT_FOUND
-// The radio is not known by the system or the Address field of
-// the BLUETOOTH_DEVICE_INFO structure is all zeros.
-//
-// ERROR_INVALID_PARAMETER
-// pbtdi is NULL.
-//
-// other error codes
-//
-DWORD
-WINAPI
-BluetoothGetDeviceInfo(
- HANDLE hRadio,
- BLUETOOTH_DEVICE_INFO * pbtdi
- );
-
-//
-// Description:
-// Updates the computer local cache about the device.
-//
-// Parameters:
-// pbtdi
-// A pointer to the BLUETOOTH_DEVICE_INFO structure to be updated.
-// The following members must be valid:
-// dwSize
-// Must match the size of the structure.
-// Address
-// Must be a previously found radio address.
-// szName
-// New name to be stored.
-//
-// Return Values:
-// ERROR_SUCCESS
-// The device information was updated successfully.
-//
-// ERROR_INVALID_PARAMETER
-// pbtdi is NULL.
-//
-// ERROR_REVISION_MISMATCH
-// pbtdi->dwSize is invalid.
-//
-// other Win32 error codes.
-//
-DWORD
-WINAPI
-BluetoothUpdateDeviceRecord(
- BLUETOOTH_DEVICE_INFO * pbtdi
- );
-
-//
-// Description:
-// Delete the authentication (aka "bond") between the computer and the
-// device. Also purges any cached information about the device.
-//
-// Return Values:
-// ERROR_SUCCESS
-// The device was removed successfully.
-//
-// ERROR_NOT_FOUND
-// The device was not found. If no Bluetooth radio is installed,
-// the devices could not be enumerated or removed.
-//
-DWORD
-WINAPI
-BluetoothRemoveDevice(
- BLUETOOTH_ADDRESS * pAddress
- );
-
-// ***************************************************************************
-//
-// Device Picker Dialog
-//
-// Description:
-// Invokes a common dialog for selecting Bluetooth devices. The list
-// of devices displayed to the user is determined by the flags and
-// settings the caller specifies in the BLUETOOTH_SELECT_DEVICE_PARAMS
-// (see structure definition for more details).
-//
-// If BluetoothSelectDevices() returns TRUE, the caller must call
-// BluetoothSelectDevicesFree() or memory will be leaked within the
-// process.
-//
-// Sample Usage:
-//
-// BLUETOOTH_SELECT_DEVICE_PARAMS btsdp = { sizeof(btsdp) };
-//
-// btsdp.hwndParent = hDlg;
-// btsdp.fShowUnknown = TRUE;
-// btsdp.fAddNewDeviceWizard = TRUE;
-//
-// BOOL b = BluetoothSelectDevices( &btsdp );
-// if ( b )
-// {
-// BLUETOOTH_DEVICE_INFO * pbtdi = btsdp.pDevices;
-// for ( ULONG cDevice = 0; cDevice < btsdp.cNumDevices; cDevice ++ )
-// {
-// if ( pbtdi->fAuthenticated || pbtdi->fRemembered )
-// {
-// //
-// // TODO: Do something usefull with the device info
-// //
-// }
-//
-// pbtdi = (BLUETOOTH_DEVICE_INFO *) ((LPBYTE)pbtdi + pbtdi->dwSize);
-// }
-//
-// BluetoothSelectDevicesFree( &btsdp );
-// }
-//
-// ***************************************************************************
-
-
-typedef struct _BLUETOOTH_COD_PAIRS {
- ULONG ulCODMask; // ClassOfDevice mask to compare
- LPCWSTR pcszDescription; // Descriptive string of mask
-
-} BLUETOOTH_COD_PAIRS;
-
-typedef BOOL (WINAPI *PFN_DEVICE_CALLBACK)(LPVOID pvParam, PBLUETOOTH_DEVICE_INFO pDevice);
-
-typedef struct _BLUETOOTH_SELECT_DEVICE_PARAMS {
- DWORD dwSize; // IN sizeof this structure
-
- ULONG cNumOfClasses; // IN Number in prgClassOfDevice - if ZERO search for all devices
- BLUETOOTH_COD_PAIRS * prgClassOfDevices; // IN Array of CODs to find.
-
- LPWSTR pszInfo; // IN If not NULL, sets the "information" text
-
- HWND hwndParent; // IN parent window - NULL == no parent
-
- BOOL fForceAuthentication; // IN If TRUE, authenication will be forced before returning
- BOOL fShowAuthenticated; // IN If TRUE, authenticated devices will be shown in the picker
- BOOL fShowRemembered; // IN If TRUE, remembered devices will be shown in the picker
- BOOL fShowUnknown; // IN If TRUE, unknown devices that are not authenticated or "remember" will be shown.
-
- BOOL fAddNewDeviceWizard; // IN If TRUE, invokes the add new device wizard.
- BOOL fSkipServicesPage; // IN If TRUE, skips the "Services" page in the wizard.
-
- PFN_DEVICE_CALLBACK pfnDeviceCallback; // IN If non-NULL, a callback that will be called for each device. If the
- // the callback returns TRUE, the item will be added. If the callback is
- // is FALSE, the item will not be shown.
- LPVOID pvParam; // IN Parameter to be passed to pfnDeviceCallback as the pvParam.
-
- DWORD cNumDevices; // IN number calles wants - ZERO == no limit.
- // OUT the number of devices returned.
-
- PBLUETOOTH_DEVICE_INFO pDevices; // OUT pointer to an array for BLUETOOTH_DEVICE_INFOs.
- // call BluetoothSelectDevicesFree() to free
-
-} BLUETOOTH_SELECT_DEVICE_PARAMS;
-
-//
-// Description:
-// (See header above)
-//
-// Return Values:
-// TRUE
-// User selected a device. pbtsdp->pDevices points to valid data.
-// Caller should check the fAuthenticated && fRemembered flags to
-// determine which devices we successfuly authenticated or valid
-// selections by the user.
-//
-// Use BluetoothSelectDevicesFree() to free the nessecary data
-// such as pDevices only if this function returns TRUE.
-//
-// FALSE
-// No valid data returned. Call GetLastError() for possible details
-// of the failure. If GLE() is:
-//
-// ERROR_CANCELLED
-// The user cancelled the request.
-//
-// ERROR_INVALID_PARAMETER
-// The pbtsdp is NULL.
-//
-// ERROR_REVISION_MISMATCH
-// The structure passed in as pbtsdp is of an unknown size.
-//
-// other WIN32 errors
-//
-BOOL
-WINAPI
-BluetoothSelectDevices(
- BLUETOOTH_SELECT_DEVICE_PARAMS * pbtsdp
- );
-
-//
-// Description:
-// This function should only be called if BluetoothSelectDevices() returns
-// TRUE. This function will free any memory and resource returned by the
-// BluetoothSelectDevices() in the BLUETOOTH_SELECT_DEVICE_PARAMS
-// structure.
-//
-// Return Values:
-// TRUE
-// Success.
-//
-// FALSE
-// Nothing to free.
-//
-BOOL
-WINAPI
-BluetoothSelectDevicesFree(
- BLUETOOTH_SELECT_DEVICE_PARAMS * pbtsdp
- );
-
-// ***************************************************************************
-//
-// Device Property Sheet
-//
-// ***************************************************************************
-
-//
-// Description:
-// Invokes the CPLs device info property sheet.
-//
-// Parameters:
-// hwndParent
-// HWND to parent the property sheet.
-//
-// pbtdi
-// A pointer to a BLUETOOTH_DEVICE_INFO structure of the device
-// to be displayed.
-//
-// Return Values:
-// TRUE
-// The property page was successfully displayed.
-//
-// FALSE
-// Failure. The property page was not displayed. Check GetLastError
-// for more details.
-//
-BOOL
-WINAPI
-BluetoothDisplayDeviceProperties(
- HWND hwndParent,
- BLUETOOTH_DEVICE_INFO * pbtdi
- );
-
-
-// ***************************************************************************
-//
-// Radio Authentication
-//
-// ***************************************************************************
-
-//
-// Description:
-// Sends an authentication request to a remote device.
-//
-// There are two modes of operation. "Wizard mode" and "Blind mode."
-//
-// "Wizard mode" is invoked when the pszPasskey is NULL. This will cause
-// the "Bluetooth Connection Wizard" to be invoked. The user will be
-// prompted to enter a passkey during the wizard after which the
-// authentication request will be sent. The user will see the success
-// or failure of the authentication attempt. The user will also be
-// given the oppurtunity to try to fix a failed authentication.
-//
-// "Blind mode" is invoked when the pszPasskey is non-NULL. This will
-// cause the computer to send a authentication request to the remote
-// device. No UI is ever displayed. The Bluetooth status code will be
-// mapped to a Win32 Error code.
-//
-// Parameters:
-//
-// hwndParent
-// The window to parent the authentication wizard. If NULL, the
-// wizard will be parented off the desktop.
-//
-// hRadio
-// A valid local radio handle or NULL. If NULL, then all radios will
-// be tired. If any of the radios succeed, then the call will
-// succeed.
-//
-// pbtdi
-// BLUETOOTH_DEVICE_INFO record of the device to be authenticated.
-//
-// pszPasskey
-// PIN to be used to authenticate the device. If NULL, then UI is
-// displayed and the user steps through the authentication process.
-// If not NULL, no UI is shown. The passkey is NOT NULL terminated.
-//
-// ulPasskeyLength
-// Length of szPassKey in bytes. The length must be less than or
-// equal to BLUETOOTH_MAX_PASSKEY_SIZE * sizeof(WCHAR).
-//
-// Return Values:
-//
-// ERROR_SUCCESS
-// Success.
-//
-// ERROR_CANCELLED
-// User aborted the operation.
-//
-// ERROR_INVALID_PARAMETER
-// The device structure in pbtdi is invalid.
-//
-// ERROR_NO_MORE_ITEMS
-// The device in pbtdi is already been marked as authenticated.
-//
-// other WIN32 error
-// Failure. Return value is the error code.
-//
-// For "Blind mode," here is the current mapping of Bluetooth status
-// code to Win32 error codes:
-//
-// { BTH_ERROR_SUCCESS, ERROR_SUCCESS },
-// { BTH_ERROR_NO_CONNECTION, ERROR_DEVICE_NOT_CONNECTED },
-// { BTH_ERROR_PAGE_TIMEOUT, WAIT_TIMEOUT },
-// { BTH_ERROR_HARDWARE_FAILURE, ERROR_GEN_FAILURE },
-// { BTH_ERROR_AUTHENTICATION_FAILURE, ERROR_NOT_AUTHENTICATED },
-// { BTH_ERROR_MEMORY_FULL, ERROR_NOT_ENOUGH_MEMORY },
-// { BTH_ERROR_CONNECTION_TIMEOUT, WAIT_TIMEOUT },
-// { BTH_ERROR_LMP_RESPONSE_TIMEOUT, WAIT_TIMEOUT },
-// { BTH_ERROR_MAX_NUMBER_OF_CONNECTIONS, ERROR_REQ_NOT_ACCEP },
-// { BTH_ERROR_PAIRING_NOT_ALLOWED, ERROR_ACCESS_DENIED },
-// { BTH_ERROR_UNSPECIFIED_ERROR, ERROR_NOT_READY },
-// { BTH_ERROR_LOCAL_HOST_TERMINATED_CONNECTION, ERROR_VC_DISCONNECTED },
-//
-DWORD
-WINAPI
-BluetoothAuthenticateDevice(
- HWND hwndParent,
- HANDLE hRadio,
- BLUETOOTH_DEVICE_INFO * pbtbi,
- PWCHAR pszPasskey,
- ULONG ulPasskeyLength
- );
-
-//
-// Description:
-// Allows the caller to prompt for multiple devices to be authenticated
-// within a single instance of the "Bluetooth Connection Wizard."
-//
-// Parameters:
-//
-// hwndParent
-// The window to parent the authentication wizard. If NULL, the
-// wizard will be parented off the desktop.
-//
-// hRadio
-// A valid local radio handle or NULL. If NULL, then all radios will
-// be tired. If any of the radios succeed, then the call will
-// succeed.
-//
-// cDevices
-// Number of devices in the rgbtdi array.
-//
-// rgbtdi
-// An array BLUETOOTH_DEVICE_INFO records of the devices to be
-// authenticated.
-//
-// Return Values:
-//
-// ERROR_SUCCESS
-// Success. Check the fAuthenticate flag on each of the devices.
-//
-// ERROR_CANCELLED
-// User aborted the operation. Check the fAuthenticate flags on
-// each device to determine if any of the devices were authenticated
-// before the user cancelled the operation.
-//
-// ERROR_INVALID_PARAMETER
-// One of the items in the array of devices is invalid.
-//
-// ERROR_NO_MORE_ITEMS
-// All the devices in the array of devices are already been marked as
-// being authenticated.
-//
-// other WIN32 error
-// Failure. Return value is the error code.
-//
-DWORD
-WINAPI
-BluetoothAuthenticateMultipleDevices(
- HWND hwndParent,
- HANDLE hRadio,
- DWORD cDevices,
- BLUETOOTH_DEVICE_INFO * pbtdi
- );
-
-// ***************************************************************************
-//
-// Bluetooth Services
-//
-// ***************************************************************************
-
-#define BLUETOOTH_SERVICE_DISABLE 0x00
-#define BLUETOOTH_SERVICE_ENABLE 0x01
-#define BLUETOOTH_SERVICE_MASK ( BLUETOOTH_ENABLE_SERVICE | BLUETOOTH_DISABLE_SERVICE )
-
-//
-// Description:
-// Enables/disables the services for a particular device.
-//
-// The system maintains a mapping of service guids to supported drivers for
-// Bluetooth-enabled devices. Enabling a service installs the corresponding
-// device driver. Disabling a service removes the corresponding device driver.
-//
-// If a non-supported service is enabled, a driver will not be installed.
-//
-// Parameters
-// hRadio
-// Handle of the local Bluetooth radio device.
-//
-// pbtdi
-// Pointer to a BLUETOOTH_DEVICE_INFO record.
-//
-// pGuidService
-// The service GUID on the remote device.
-//
-// dwServiceFlags
-// Flags to adjust the service.
-// BLUETOOTH_SERVICE_DISABLE - disable the service
-// BLUETOOTH_SERVICE_ENABLE - enables the service
-//
-// Return Values:
-// ERROR_SUCCESS
-// The call was successful.
-//
-// ERROR_INVALID_PARAMETER
-// dwServiceFlags are invalid.
-//
-// ERROR_SERVICE_DOES_NOT_EXIST
-// The GUID in pGuidService is not supported.
-//
-// other WIN32 error
-// The call failed.
-//
-DWORD
-WINAPI
-BluetoothSetServiceState(
- HANDLE hRadio,
- BLUETOOTH_DEVICE_INFO * pbtdi,
- GUID * pGuidService,
- DWORD dwServiceFlags
- );
-
-//
-// Description:
-// Enumerates the services guids enabled on a particular device. If hRadio
-// is NULL, all device will be searched for the device and all the services
-// enabled will be returned.
-//
-// Parameters:
-// hRadio
-// Handle of the local Bluetooth radio device. If NULL, it will search
-// all the radios for the address in the pbtdi.
-//
-// pbtdi
-// Pointer to a BLUETOOTH_DEVICE_INFO record.
-//
-// pcService
-// On input, the number of records pointed to by pGuidServices.
-// On output, the number of valid records return in pGuidServices.
-//
-// pGuidServices
-// Pointer to memory that is at least *pcService in length.
-//
-// Return Values:
-// ERROR_SUCCESS
-// The call succeeded. pGuidServices is valid.
-//
-// ERROR_MORE_DATA
-// The call succeeded. pGuidService contains an incomplete list of
-// enabled service GUIDs.
-//
-// other WIN32 errors
-// The call failed.
-//
-DWORD
-WINAPI
-BluetoothEnumerateInstalledServices(
- HANDLE hRadio,
- BLUETOOTH_DEVICE_INFO * pbtdi,
- DWORD * pcServices,
- GUID * pGuidServices
- );
-
-//
-// Description:
-// Change the discovery state of the local radio(s).
-// If hRadio is NULL, all the radios will be set.
-//
-// Use BluetoothIsDiscoverable() to determine the radios current state.
-//
-// The system ensures that a discoverable system is connectable, thus
-// the radio must allow incoming connections (see
-// BluetoothEnableIncomingConnections) prior to making a radio
-// discoverable. Failure to do so will result in this call failing
-// (returns FALSE).
-//
-// Parameters:
-// hRadio
-// If not NULL, changes the state of a specific radio.
-// If NULL, the API will interate through all the radios.
-//
-// fEnabled
-// If FALSE, discovery will be disabled.
-//
-// Return Values
-// TRUE
-// State was successfully changed. If the caller specified NULL for
-// hRadio, at least of the radios accepted the state change.
-//
-// FALSE
-// State was not changed. If the caller specified NULL for hRadio, all
-// of the radios did not accept the state change.
-//
-BOOL
-WINAPI
-BluetoothEnableDiscovery(
- HANDLE hRadio,
- BOOL fEnabled
- );
-
-//
-// Description:
-// Determines if the Bluetooth radios are discoverable. If there are
-// multiple radios, the first one to say it is discoverable will cause
-// this function to return TRUE.
-//
-// Parameters:
-// hRadio
-// Handle of the radio to check. If NULL, it will check all local
-// radios.
-//
-// Return Values:
-// TRUE
-// A least one radio is discoverable.
-//
-// FALSE
-// No radios are discoverable.
-//
-BOOL
-WINAPI
-BluetoothIsDiscoverable(
- HANDLE hRadio
- );
-
-//
-// Description:
-// Enables/disables the state of a radio to accept incoming connections.
-// If hRadio is NULL, all the radios will be set.
-//
-// Use BluetoothIsConnectable() to determine the radios current state.
-//
-// The system enforces that a radio that is not connectable is not
-// discoverable too. The radio must be made non-discoverable (see
-// BluetoothEnableDiscovery) prior to making a radio non-connectionable.
-// Failure to do so will result in this call failing (returns FALSE).
-//
-// Parameters:
-// hRadio
-// If not NULL, changes the state of a specific radio.
-// If NULL, the API will interate through all the radios.
-//
-// fEnabled
-// If FALSE, incoming connection will be disabled.
-//
-// Return Values
-// TRUE
-// State was successfully changed. If the caller specified NULL for
-// hRadio, at least of the radios accepted the state change.
-//
-// FALSE
-// State was not changed. If the caller specified NULL for hRadio, all
-// of the radios did not accept the state change.
-//
-BOOL
-WINAPI
-BluetoothEnableIncomingConnections(
- HANDLE hRadio,
- BOOL fEnabled
- );
-
-//
-// Description:
-// Determines if the Bluetooth radios are connectable. If there are
-// multiple radios, the first one to say it is connectable will cause
-// this function to return TRUE.
-//
-// Parameters:
-// hRadio
-// Handle of the radio to check. If NULL, it will check all local
-// radios.
-//
-// Return Values:
-// TRUE
-// A least one radio is allowing incoming connections.
-//
-// FALSE
-// No radios are allowing incoming connections.
-//
-BOOL
-WINAPI
-BluetoothIsConnectable(
- HANDLE hRadio
- );
-
-// ***************************************************************************
-//
-// Authentication Registration
-//
-// ***************************************************************************
-
-typedef HANDLE HBLUETOOTH_AUTHENTICATION_REGISTRATION;
-
-typedef BOOL (*PFN_AUTHENTICATION_CALLBACK)(LPVOID pvParam, PBLUETOOTH_DEVICE_INFO pDevice);
-
-//
-// Description:
-// Registers a callback function to be called when a particular device
-// requests authentication. The request is sent to the last application
-// that requested authentication for a particular device.
-//
-// Parameters:
-// pbtdi
-// A pointer to a BLUETOOTH_DEVICE_INFO structure. The Bluetooth
-// address will be used for comparision.
-//
-// phRegHandle
-// A pointer to where the registration HANDLE value will be
-// stored. Call BluetoothUnregisterAuthentication() to close
-// the handle.
-//
-// pfnCallback
-// The function that will be called when the authentication event
-// occurs. This function should match PFN_AUTHENTICATION_CALLBACK's
-// prototype.
-//
-// pvParam
-// Optional parameter to be past through to the callback function.
-// This can be anything the application was to define.
-//
-// Return Values:
-// ERROR_SUCCESS
-// Success. A valid registration handle was returned.
-//
-// ERROR_OUTOFMEMORY
-// Out of memory.
-//
-// other Win32 error.
-// Failure. The registration handle is invalid.
-//
-DWORD
-WINAPI
-BluetoothRegisterForAuthentication(
- BLUETOOTH_DEVICE_INFO * pbtdi,
- HBLUETOOTH_AUTHENTICATION_REGISTRATION * phRegHandle,
- PFN_AUTHENTICATION_CALLBACK pfnCallback,
- PVOID pvParam
- );
-
-//
-// Description:
-// Unregisters an authentication callback and closes the handle. See
-// BluetoothRegisterForAuthentication() for more information about
-// authentication registration.
-//
-// Parameters:
-// hRegHandle
-// Handle returned by BluetoothRegisterForAuthentication().
-//
-// Return Value:
-// TRUE
-// The handle was successfully closed.
-//
-// FALSE
-// The handle was not successfully closed. Check GetLastError for
-// more details.
-//
-// ERROR_INVALID_HANDLE
-// The handle is NULL.
-//
-// other Win32 errors.
-//
-BOOL
-WINAPI
-BluetoothUnregisterAuthentication(
- HBLUETOOTH_AUTHENTICATION_REGISTRATION hRegHandle
- );
-
-//
-// Description:
-// This function should be called after receiving an authentication request
-// to send the passkey response.
-//
-// Parameters:
-//
-// hRadio
-// Optional handle to the local radio. If NULL, the function will try
-// each radio until one succeeds.
-//
-// pbtdi
-// A pointer to a BLUETOOTH_DEVICE_INFO structure describing the device
-// being authenticated. This can be the same structure passed to the
-// callback function.
-//
-// pszPasskey
-// A pointer to UNICODE zero-terminated string of the passkey response
-// that should be sent back to the authenticating device.
-//
-// Return Values:
-// ERROR_SUCESS
-// The device accepted the passkey response. The device is authenticated.
-//
-// ERROR_CANCELED
-// The device denied the passkey reponse. This also will returned if there
-// is a communications problem with the local radio.
-//
-// E_FAIL
-// The device returned a failure code during authentication.
-//
-// other Win32 error codes
-//
-DWORD
-WINAPI
-BluetoothSendAuthenticationResponse(
- HANDLE hRadio,
- BLUETOOTH_DEVICE_INFO * pbtdi,
- LPWSTR pszPasskey
- );
-
-// ***************************************************************************
-//
-// SDP Parsing Functions
-//
-// ***************************************************************************
-
-typedef struct _SDP_ELEMENT_DATA {
- //
- // Enumeration of SDP element types. Generic element types will have a
- // specificType value other then SDP_ST_NONE. The generic types are:
- // o SDP_TYPE_UINT
- // o SDP_TYPE_INT
- // o SDP_TYPE_UUID
- //
- SDP_TYPE type;
-
- //
- // Specific types for the generic SDP element types.
- //
- SDP_SPECIFICTYPE specificType;
-
- //
- // Union of all possible data types. type and specificType will indicate
- // which field is valid. For types which do not have a valid specificType,
- // specific type will be SDP_ST_NONE.
- //
- union {
- // type == SDP_TYPE_INT
- SDP_LARGE_INTEGER_16 int128; // specificType == SDP_ST_INT128
- LONGLONG int64; // specificType == SDP_ST_INT64
- LONG int32; // specificType == SDP_ST_INT32
- SHORT int16; // specificType == SDP_ST_INT16
- CHAR int8; // specificType == SDP_ST_INT8
-
- // type == SDP_TYPE_UINT
- SDP_ULARGE_INTEGER_16 uint128; // specificType == SDP_ST_UINT128
- ULONGLONG uint64; // specificType == SDP_ST_UINT64
- ULONG uint32; // specificType == SDP_ST_UINT32
- USHORT uint16; // specificType == SDP_ST_UINT16
- UCHAR uint8; // specificType == SDP_ST_UINT8
-
- // type == SDP_TYPE_BOOLEAN
- UCHAR booleanVal;
-
- // type == SDP_TYPE_UUID
- GUID uuid128; // specificType == SDP_ST_UUID128
- ULONG uuid32; // specificType == SDP_ST_UUID32
- USHORT uuid16; // specificType == SDP_ST_UUID32
-
- // type == SDP_TYPE_STRING
- struct {
- // raw string buffer, may not be encoded as ANSI, use
- // BluetoothSdpGetString to convert the value if it is described
- // by the base language attribute ID list
- LPBYTE value;
-
- // raw length of the string, may not be NULL terminuated
- ULONG length;
- } string;
-
- // type == SDP_TYPE_URL
- struct {
- LPBYTE value;
- ULONG length;
- } url;
-
- // type == SDP_TYPE_SEQUENCE
- struct {
- // raw sequence, starts at sequence element header
- LPBYTE value;
-
- // raw sequence length
- ULONG length;
- } sequence;
-
- // type == SDP_TYPE_ALTERNATIVE
- struct {
- // raw alternative, starts at alternative element header
- LPBYTE value;
-
- // raw alternative length
- ULONG length;
- } alternative;
-
- } data;
-
-} SDP_ELEMENT_DATA, *PSDP_ELEMENT_DATA;
-
-//
-// Description:
-// Retrieves and parses the element found at pSdpStream
-//
-// Parameters:
-// IN pSdpStream
-// pointer to valid SDP stream
-//
-// IN cbSdpStreamLength
-// length of pSdpStream in bytes
-//
-// OUT pData
-// pointer to be filled in with the data of the SDP element at the
-// beginning of pSdpStream
-//
-// Return Values:
-// ERROR_INVALID_PARAMETER
-// one of required parameters is NULL or the pSdpStream is invalid
-//
-// ERROR_SUCCESS
-// the sdp element was parsed correctly
-//
-DWORD
-WINAPI
-BluetoothSdpGetElementData(
- LPBYTE pSdpStream,
- ULONG cbSdpStreamLength,
- PSDP_ELEMENT_DATA pData
- );
-
-typedef HANDLE HBLUETOOTH_CONTAINER_ELEMENT;
-
-//
-// Description:
-// Iterates over a container stream, returning each elemetn contained with
-// in the container element at the beginning of pContainerStream
-//
-// Parameters:
-// IN pContainerStream
-// pointer to valid SDP stream whose first element is either a sequence
-// or alternative
-//
-// IN cbContainerlength
-// length in bytes of pContainerStream
-//
-// IN OUT pElement
-// Value used to keep track of location within the stream. The first
-// time this function is called for a particular container, *pElement
-// should equal NULL. Upon subsequent calls, the value should be
-// unmodified.
-//
-// OUT pData
-// pointer to be filled in with the data of the SDP element at the
-// current element of pContainerStream
-//
-// Return Values:
-// ERROR_SUCCESS
-// The call succeeded, pData contains the data
-//
-// ERROR_NO_MORE_ITEMS
-// There are no more items in the list, the caller should cease calling
-// BluetoothSdpGetContainerElementData for this container.
-//
-// ERROR_INVALID_PARAMETER
-// A required pointer is NULL or the container is not a valid SDP
-// stream
-//
-// Usage example:
-//
-// HBLUETOOTH_CONTAINER_ELEMENT element;
-// SDP_ELEMENT_DATA data;
-// ULONG result;
-//
-// element = NULL;
-//
-// while (TRUE) {
-// result = BluetoothSdpGetContainerElementData(
-// pContainer, ulContainerLength, &element, &data);
-//
-// if (result == ERROR_NO_MORE_ITEMS) {
-// // We are done
-// break;
-// }
-// else if (result != ERROR_SUCCESS) {
-// // error
-// }
-//
-// // do something with data ...
-// }
-//
-//
-DWORD
-WINAPI
-BluetoothSdpGetContainerElementData(
- LPBYTE pContainerStream,
- ULONG cbContainerLength,
- HBLUETOOTH_CONTAINER_ELEMENT* pElement,
- PSDP_ELEMENT_DATA pData
- );
-
-//
-// Description:
-// Retrieves the attribute value for the given attribute ID. pRecordStream
-// must be an SDP stream that is formatted as an SDP record, a SEQUENCE
-// containing UINT16 + element pairs.
-//
-// Parameters:
-// IN pRecordStream
-// pointer to a valid SDP stream which is formatted as a singl SDP
-// record
-//
-// IN cbRecordlnegh
-// length of pRecordStream in bytes
-//
-// IN usAttributeId
-// the attribute ID to search for. see bthdef.h for SDP_ATTRIB_Xxx
-// values.
-//
-// OUT pAttributeData
-// pointer that will contain the attribute ID's value
-//
-// Return Values:
-// ERRROR_SUCCESS
-// Call succeeded, pAttributeData contains the attribute value
-//
-// ERROR_INVALID_PARAMETER
-// One of the required pointers was NULL, pRecordStream was not a valid
-// SDP stream, or pRecordStream was not a properly formatted SDP record
-//
-// ERROR_FILE_NOT_FOUND
-// usAttributeId was not found in the record
-//
-// Usage:
-//
-// ULONG result;
-// SDP_DATA_ELEMENT data;
-//
-// result = BluetoothSdpGetAttributeValue(
-// pRecordStream, cbRecordLength, SDP_ATTRIB_RECORD_HANDLE, &data);
-// if (result == ERROR_SUCCESS) {
-// printf("record handle is 0x%x\n", data.data.uint32);
-// }
-//
-DWORD
-WINAPI
-BluetoothSdpGetAttributeValue(
- LPBYTE pRecordStream,
- ULONG cbRecordLength,
- USHORT usAttributeId,
- PSDP_ELEMENT_DATA pAttributeData
- );
-
-//
-// These three fields correspond one to one with the triplets defined in the
-// SDP specification for the language base attribute ID list.
-//
-typedef struct _SDP_STRING_TYPE_DATA {
- //
- // How the string is encoded according to ISO 639:1988 (E/F): "Code
- // for the representation of names of languages".
- //
- USHORT encoding;
-
- //
- // MIBE number from IANA database
- //
- USHORT mibeNum;
-
- //
- // The base attribute where the string is to be found in the record
- //
- USHORT attributeId;
-
-} SDP_STRING_TYPE_DATA, *PSDP_STRING_TYPE_DATA;
-
-//
-// Description:
-// Converts a raw string embedded in the SDP record into a UNICODE string
-//
-// Parameters:
-// IN pRecordStream
-// a valid SDP stream which is formatted as an SDP record
-//
-// IN cbRecordLength
-// length of pRecordStream in bytes
-//
-// IN pStringData
-// if NULL, then the calling thread's locale will be used to search
-// for a matching string in the SDP record. If not NUL, the mibeNum
-// and attributeId will be used to find the string to convert.
-//
-// IN usStringOffset
-// the SDP string type offset to convert. usStringOffset is added to
-// the base attribute id of the string. SDP specification defined
-// offsets are: STRING_NAME_OFFSET, STRING_DESCRIPTION_OFFSET, and
-// STRING_PROVIDER_NAME_OFFSET (found in bthdef.h).
-//
-// OUT pszString
-// if NULL, pcchStringLength will be filled in with the required number
-// of characters (not bytes) to retrieve the converted string.
-//
-// IN OUT pcchStringLength
-// Upon input, if pszString is not NULL, will contain the length of
-// pszString in characters. Upon output, it will contain either the
-// number of required characters including NULL if an error is returned
-// or the number of characters written to pszString (including NULL).
-//
-// Return Values:
-// ERROR_SUCCES
-// Call was successful and pszString contains the converted string
-//
-// ERROR_MORE_DATA
-// pszString was NULL or too small to contain the converted string,
-// pccxhStringLength contains the required length in characters
-//
-// ERROR_INVALID_DATA
-// Could not perform the conversion
-//
-// ERROR_NO_SYSTEM_RESOURCES
-// Could not allocate memory internally to perform the conversion
-//
-// ERROR_INVALID_PARAMETER
-// One of the rquired pointers was NULL, pRecordStream was not a valid
-// SDP stream, pRecordStream was not a properly formatted record, or
-// the desired attribute + offset was not a string.
-//
-// Other HRESULTs returned by COM
-//
-DWORD
-WINAPI
-BluetoothSdpGetString(
- LPBYTE pRecordStream,
- ULONG cbRecordLength,
- PSDP_STRING_TYPE_DATA pStringData,
- USHORT usStringOffset,
- PWCHAR pszString,
- PULONG pcchStringLength
- );
-
-// ***************************************************************************
-//
-// Raw Attribute Enumeration
-//
-// ***************************************************************************
-
-typedef BOOL (CALLBACK *PFN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK)(
- ULONG uAttribId,
- LPBYTE pValueStream,
- ULONG cbStreamSize,
- LPVOID pvParam
- );
-
-//
-// Description:
-// Enumerates through the SDP record stream calling the Callback function
-// for each attribute in the record. If the Callback function returns
-// FALSE, the enumeration is stopped.
-//
-// Return Values:
-// TRUE
-// Success! Something was enumerated.
-//
-// FALSE
-// Failure. GetLastError() could be one of the following:
-//
-// ERROR_INVALID_PARAMETER
-// pSDPStream or pfnCallback is NULL.
-//
-// ERROR_INVALID_DATA
-// The SDP stream is corrupt.
-//
-// other Win32 errors.
-//
-#define BluetoothEnumAttributes BluetoothSdpEnumAttributes
-
-BOOL
-WINAPI
-BluetoothSdpEnumAttributes(
- LPBYTE pSDPStream,
- ULONG cbStreamSize,
- PFN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK pfnCallback,
- LPVOID pvParam
- );
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/cpp/Wiipair/include/bthdef.h b/cpp/Wiipair/include/bthdef.h
deleted file mode 100644
index 2dd26aa..0000000
--- a/cpp/Wiipair/include/bthdef.h
+++ /dev/null
@@ -1,858 +0,0 @@
-/*++
-
-Copyright (c) 2000 Microsoft Corporation
-
-Module Name:
-
- bthdef.h
-
-Abstract:
-
- This module contains the Bluetooth common structures and definitions
-
-Author:
-
-Notes:
-
-Environment:
-
- Kernel mode only
-
-
-Revision History:
-
- --*/
-
-#ifndef __BTHDEF_H__
-#define __BTHDEF_H__
-
-#ifndef GUID_DEFS_ONLY
- #ifndef NO_BTHSDPDEF_INC
- #include "bthsdpdef.h"
- #endif // NO_BTHSDPDEF_INC
-#endif // GUID_DEFS_ONLY
-
-#ifndef NO_GUID_DEFS
-
-// {0850302A-B344-4fda-9BE9-90576B8D46F0}
-DEFINE_GUID(GUID_BTHPORT_DEVICE_INTERFACE, 0x850302a, 0xb344, 0x4fda, 0x9b, 0xe9, 0x90, 0x57, 0x6b, 0x8d, 0x46, 0xf0);
-
-// {EA3B5B82-26EE-450E-B0D8-D26FE30A3869}
-DEFINE_GUID(GUID_BLUETOOTH_RADIO_IN_RANGE, 0xea3b5b82, 0x26ee, 0x450e, 0xb0, 0xd8, 0xd2, 0x6f, 0xe3, 0x0a, 0x38, 0x69);
-
-// {E28867C9-C2AA-4CED-B969-4570866037C4}
-DEFINE_GUID(GUID_BLUETOOTH_RADIO_OUT_OF_RANGE, 0xe28867c9, 0xc2aa, 0x4ced, 0xb9, 0x69, 0x45, 0x70, 0x86, 0x60, 0x37, 0xc4);
-
-// BD198B7C-24AB-4B9A-8C0D-A8EA8349AA16
-DEFINE_GUID(GUID_BLUETOOTH_PIN_REQUEST, 0xbd198b7c, 0x24ab, 0x4b9a, 0x8c, 0x0d, 0xa8, 0xea, 0x83, 0x49, 0xaa, 0x16);
-
-// {7EAE4030-B709-4AA8-AC55-E953829C9DAA}
-DEFINE_GUID(GUID_BLUETOOTH_L2CAP_EVENT, 0x7eae4030, 0xb709, 0x4aa8, 0xac, 0x55, 0xe9, 0x53, 0x82, 0x9c, 0x9d, 0xaa);
-
-// {FC240062-1541-49BE-B463-84C4DCD7BF7F}
-DEFINE_GUID(GUID_BLUETOOTH_HCI_EVENT, 0xfc240062, 0x1541, 0x49be, 0xb4, 0x63, 0x84, 0xc4, 0xdc, 0xd7, 0xbf, 0x7f);
-
-//
-// Bluetooth base UUID for service discovery
-//
-DEFINE_GUID(Bluetooth_Base_UUID, 0x00000000, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-
-//
-// UUID for the root of the browse group list
-//
-
-DEFINE_GUID(SDP_PROTOCOL_UUID, 0x00000001, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(UDP_PROTOCOL_UUID, 0x00000002, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(RFCOMM_PROTOCOL_UUID, 0x00000003, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(TCP_PROTOCOL_UUID, 0x00000004, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(TCSBIN_PROTOCOL_UUID, 0x00000005, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(TCSAT_PROTOCOL_UUID, 0x00000006, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(OBEX_PROTOCOL_UUID, 0x00000008, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(IP_PROTOCOL_UUID, 0x00000009, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(FTP_PROTOCOL_UUID, 0x0000000A, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(HTTP_PROTOCOL_UUID, 0x0000000C, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(WSP_PROTOCOL_UUID, 0x0000000E, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(BNEP_PROTOCOL_UUID, 0x0000000F, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(UPNP_PROTOCOL_UUID, 0x00000010, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(HID_PROTOCOL_UUID, 0x00000011, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(HCCC_PROTOCOL_UUID, 0x00000012, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(HCDC_PROTOCOL_UUID, 0x00000014, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(HN_PROTOCOL_UUID, 0x00000016, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(AVCTP_PROTOCOL_UUID, 0x00000017, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(AVDTP_PROTOCOL_UUID, 0x00000019, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(CMPT_PROTOCOL_UUID, 0x0000001B, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(UDI_C_PLANE_PROTOCOL_UUID, 0x0000001D, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(L2CAP_PROTOCOL_UUID, 0x00000100, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-
-#define SDP_PROTOCOL_UUID16 (0x0001)
-#define UDP_PROTOCOL_UUID16 (0x0002)
-#define RFCOMM_PROTOCOL_UUID16 (0x0003)
-#define TCP_PROTOCOL_UUID16 (0x0004)
-#define TCSBIN_PROTOCOL_UUID16 (0x0005)
-#define TCSAT_PROTOCOL_UUID16 (0x0006)
-#define OBEX_PROTOCOL_UUID16 (0x0008)
-#define IP_PROTOCOL_UUID16 (0x0009)
-#define FTP_PROTOCOL_UUID16 (0x000A)
-#define HTTP_PROTOCOL_UUID16 (0x000C)
-#define WSP_PROTOCOL_UUID16 (0x000E)
-#define BNEP_PROTOCOL_UUID16 (0x000F)
-#define UPNP_PROTOCOL_UUID16 (0x0010)
-#define HID_PROTOCOL_UUID16 (0x0011)
-#define HCCC_PROTOCOL_UUID16 (0x0012)
-#define HCDC_PROTOCOL_UUID16 (0x0014)
-#define HCN_PROTOCOL_UUID16 (0x0016)
-#define AVCTP_PROTOCOL_UUID16 (0x0017)
-#define AVDTP_PROTOCOL_UUID16 (0x0019)
-#define CMPT_PROTOCOL_UUID16 (0x001B)
-#define UDI_C_PLANE_PROTOCOL_UUID16 (0x001D)
-#define L2CAP_PROTOCOL_UUID16 (0x0100)
-
-DEFINE_GUID(ServiceDiscoveryServerServiceClassID_UUID, 0x00001000, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(BrowseGroupDescriptorServiceClassID_UUID, 0x00001001, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(PublicBrowseGroupServiceClass_UUID, 0x00001002, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(SerialPortServiceClass_UUID, 0x00001101, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(LANAccessUsingPPPServiceClass_UUID, 0x00001102, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(DialupNetworkingServiceClass_UUID, 0x00001103, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(IrMCSyncServiceClass_UUID, 0x00001104, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(OBEXObjectPushServiceClass_UUID, 0x00001105, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(OBEXFileTransferServiceClass_UUID, 0x00001106, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(IrMCSyncCommandServiceClass_UUID, 0x00001107, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(HeadsetServiceClass_UUID, 0x00001108, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(CordlessTelephonyServiceClass_UUID, 0x00001109, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(AudioSourceServiceClass_UUID, 0x0000110A, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(AudioSinkServiceClass_UUID, 0x0000110B, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(AVRemoteControlTargetServiceClass_UUID, 0x0000110C, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(AdvancedAudioDistributionServiceClass_UUID,0x0000110D, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(AVRemoteControlServiceClass_UUID, 0x0000110E, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(VideoConferencingServiceClass_UUID, 0x0000110F, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(IntercomServiceClass_UUID, 0x00001110, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(FaxServiceClass_UUID, 0x00001111, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(HeadsetAudioGatewayServiceClass_UUID, 0x00001112, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(WAPServiceClass_UUID, 0x00001113, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(WAPClientServiceClass_UUID, 0x00001114, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(PANUServiceClass_UUID, 0x00001115, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(NAPServiceClass_UUID, 0x00001116, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(GNServiceClass_UUID, 0x00001117, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(DirectPrintingServiceClass_UUID, 0x00001118, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(ReferencePrintingServiceClass_UUID, 0x00001119, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(ImagingServiceClass_UUID, 0x0000111A, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(ImagingResponderServiceClass_UUID, 0x0000111B, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(ImagingAutomaticArchiveServiceClass_UUID, 0x0000111C, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(ImagingReferenceObjectsServiceClass_UUID, 0x0000111D, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(HandsfreeServiceClass_UUID, 0x0000111E, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(HandsfreeAudioGatewayServiceClass_UUID, 0x0000111F, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(DirectPrintingReferenceObjectsServiceClass_UUID,
- 0x00001120, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(ReflectedUIServiceClass_UUID, 0x00001121, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(BasicPringingServiceClass_UUID, 0x00001122, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(PrintingStatusServiceClass_UUID, 0x00001123, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(HumanInterfaceDeviceServiceClass_UUID, 0x00001124, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(HardcopyCableReplacementServiceClass_UUID, 0x00001125, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(HCRPrintServiceClass_UUID, 0x00001126, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(HCRScanServiceClass_UUID, 0x00001127, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(CommonISDNAccessServiceClass_UUID, 0x00001128, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(VideoConferencingGWServiceClass_UUID, 0x00001129, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(UDIMTServiceClass_UUID, 0x0000112A, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(UDITAServiceClass_UUID, 0x0000112B, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(AudioVideoServiceClass_UUID, 0x0000112C, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(PnPInformationServiceClass_UUID, 0x00001200, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(GenericNetworkingServiceClass_UUID, 0x00001201, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(GenericFileTransferServiceClass_UUID, 0x00001202, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(GenericAudioServiceClass_UUID, 0x00001203, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-DEFINE_GUID(GenericTelephonyServiceClass_UUID, 0x00001204, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
-
-#define ServiceDiscoveryServerServiceClassID_UUID16 (0x1000)
-#define BrowseGroupDescriptorServiceClassID_UUID16 (0x1001)
-#define PublicBrowseGroupServiceClassID_UUID16 (0x1002)
-#define SerialPortServiceClassID_UUID16 (0x1101)
-#define LANAccessUsingPPPServiceClassID_UUID16 (0x1102)
-#define DialupNetworkingServiceClassID_UUID16 (0x1103)
-#define IrMCSyncServiceClassID_UUID16 (0x1104)
-#define OBEXObjectPushServiceClassID_UUID16 (0x1105)
-#define OBEXFileTransferServiceClassID_UUID16 (0x1106)
-#define IrMcSyncCommandServiceClassID_UUID16 (0x1107)
-#define HeadsetServiceClassID_UUID16 (0x1108)
-#define CordlessServiceClassID_UUID16 (0x1109)
-#define AudioSourceServiceClassID_UUID16 (0x110A)
-#define AudioSinkSourceServiceClassID_UUID16 (0x110B)
-#define AVRemoteControlTargetServiceClassID_UUID16 (0x110C)
-#define AdvancedAudioDistributionServiceClassID_UUID16 (0x110D)
-#define AVRemoteControlServiceClassID_UUID16 (0x110E)
-#define VideoConferencingServiceClassID_UUID16 (0x110F)
-#define IntercomServiceClassID_UUID16 (0x1110)
-#define FaxServiceClassID_UUID16 (0x1111)
-#define HeadsetAudioGatewayServiceClassID_UUID16 (0x1112)
-#define WAPServiceClassID_UUID16 (0x1113)
-#define WAPClientServiceClassID_UUID16 (0x1114)
-#define PANUServiceClassID_UUID16 (0x1115)
-#define NAPServiceClassID_UUID16 (0x1116)
-#define GNServiceClassID_UUID16 (0x1117)
-#define DirectPrintingServiceClassID_UUID16 (0x1118)
-#define ReferencePrintingServiceClassID_UUID16 (0x1119)
-#define ImagingServiceClassID_UUID16 (0x111A)
-#define ImagingResponderServiceClassID_UUID16 (0x111B)
-#define ImagingAutomaticArchiveServiceClassID_UUID16 (0x111C)
-#define ImagingReferenceObjectsServiceClassID_UUID16 (0x111D)
-#define HandsfreeServiceClassID_UUID16 (0x111E)
-#define HandsfreeAudioGatewayServiceClassID_UUID16 (0x111F)
-#define DirectPrintingReferenceObjectsServiceClassID_UUID16 \
- (0x1120)
-#define ReflectsUIServiceClassID_UUID16 (0x1121)
-#define BasicPrintingServiceClassID_UUID16 (0x1122)
-#define PrintingStatusServiceClassID_UUID16 (0x1123)
-#define HumanInterfaceDeviceServiceClassID_UUID16 (0x1124)
-#define HardcopyCableReplacementServiceClassID_UUID16 (0x1125)
-#define HCRPrintServiceClassID_UUID16 (0x1126)
-#define HCRScanServiceClassID_UUID16 (0x1127)
-#define CommonISDNAccessServiceClass_UUID16 (0x1128)
-#define VideoConferencingGWServiceClass_UUID16 (0x1129)
-#define UDIMTServiceClass_UUID16 (0x112A)
-#define UDITAServiceClass_UUID16 (0x112B)
-#define AudioVideoServiceClass_UUID16 (0x112C)
-
-#define PnPInformationServiceClassID_UUID16 (0x1200)
-#define GenericNetworkingServiceClassID_UUID16 (0x1201)
-#define GenericFileTransferServiceClassID_UUID16 (0x1202)
-#define GenericAudioServiceClassID_UUID16 (0x1203)
-#define GenericTelephonyServiceClassID_UUID16 (0x1204)
-
-#endif // NO_GUID_DEFS
-
-#ifndef GUID_DEFS_ONLY
-
-//
-// max length of device friendly name.
-//
-#define BTH_MAX_NAME_SIZE (248)
-
-#define BTH_MAX_PIN_SIZE (16)
-#define BTH_LINK_KEY_LENGTH (16)
-
-#define BTH_MFG_ERICSSON (0)
-#define BTH_MFG_NOKIA (1)
-#define BTH_MFG_INTEL (2)
-#define BTH_MFG_IBM (3)
-#define BTH_MFG_TOSHIBA (4)
-#define BTH_MFG_3COM (5)
-#define BTH_MFG_MICROSOFT (6)
-#define BTH_MFG_LUCENT (7)
-#define BTH_MFG_MOTOROLA (8)
-#define BTH_MFG_INFINEON (9)
-#define BTH_MFG_CSR (10)
-#define BTH_MFG_SILICONWAVE (11)
-#define BTH_MFG_DIGIANSWER (12)
-#define BTH_MFG_TI (13)
-#define BTH_MFG_PARTHUS (14)
-#define BTH_MFG_BROADCOM (15)
-#define BTH_MFG_MITEL (16)
-#define BTH_MFG_WIDCOMM (17)
-#define BTH_MFG_ZEEVO (18)
-#define BTH_MFG_ATMEL (19)
-#define BTH_MFG_MITSIBUSHI (20)
-#define BTH_MFG_RTX_TELECOM (21)
-#define BTH_MFG_KC_TECHNOLOGY (22)
-#define BTH_MFG_NEWLOGIC (23)
-#define BTH_MFG_TRANSILICA (24)
-#define BTH_MFG_ROHDE_SCHWARZ (25)
-#define BTH_MFG_TTPCOM (26)
-#define BTH_MFG_SIGNIA (27)
-#define BTH_MFG_CONEXANT (28)
-#define BTH_MFG_QUALCOMM (29)
-#define BTH_MFG_INVENTEL (30)
-#define BTH_MFG_AVM_BERLIN (31)
-#define BTH_MFG_BANDSPEED (32)
-#define BTH_MFG_MANSELLA (33)
-#define BTH_MFG_NEC (34)
-#define BTH_MFG_WAVEPLUS_TECHNOLOGY_CO (35)
-#define BTH_MFG_ALCATEL (36)
-#define BTH_MFG_PHILIPS_SEMICONDUCTOR (37)
-#define BTH_MFG_C_TECHNOLOGIES (38)
-#define BTH_MFG_OPEN_INTERFACE (39)
-#define BTH_MFG_RF_MICRO_DEVICES (40)
-#define BTH_MFG_HITACHI (41)
-#define BTH_MFG_SYMBOL_TECHNOLOGIES (42)
-#define BTH_MFG_TENOVIS (43)
-#define BTH_MFG_MACRONIX_INTERNATIONAL (44)
-#define BTH_MFG_INTERNAL_USE (65535)
-
-typedef ULONGLONG BTH_ADDR, *PBTH_ADDR;
-typedef ULONG BTH_COD, *PBTH_COD;
-typedef ULONG BTH_LAP, *PBTH_LAP;
-
-#define BTH_ADDR_NULL ((ULONGLONG) 0x0000000000000000)
-
-#define NAP_MASK ((ULONGLONG) 0xFFFF00000000)
-#define SAP_MASK ((ULONGLONG) 0x0000FFFFFFFF)
-
-#define NAP_BIT_OFFSET (8 * 4)
-#define SAP_BIT_OFFSET (0)
-
-#define GET_NAP(_bth_addr) ((USHORT) (((_bth_addr) & NAP_MASK) >> NAP_BIT_OFFSET))
-#define GET_SAP(_bth_addr) ((ULONG) (((_bth_addr) & SAP_MASK) >> SAP_BIT_OFFSET))
-
-#define SET_NAP(_nap) (((ULONGLONG) ((USHORT) (_nap))) << NAP_BIT_OFFSET)
-#define SET_SAP(_sap) (((ULONGLONG) ((ULONG) (_sap))) << SAP_BIT_OFFSET)
-
-#define SET_NAP_SAP(_nap, _sap) (SET_NAP(_nap) | SET_SAP(_sap))
-
-#define COD_FORMAT_BIT_OFFSET (0)
-#define COD_MINOR_BIT_OFFSET (2)
-#define COD_MAJOR_BIT_OFFSET (8 * 1)
-#define COD_SERVICE_BIT_OFFSET (8 * 1 + 5)
-
-#define COD_FORMAT_MASK (0x000003)
-#define COD_MINOR_MASK (0x0000FC)
-#define COD_MAJOR_MASK (0x001F00)
-#define COD_SERVICE_MASK (0xFFE000)
-
-
-#define GET_COD_FORMAT(_cod) ( (_cod) & COD_FORMAT_MASK >> COD_FORMAT_BIT_OFFSET)
-#define GET_COD_MINOR(_cod) (((_cod) & COD_MINOR_MASK) >> COD_MINOR_BIT_OFFSET)
-#define GET_COD_MAJOR(_cod) (((_cod) & COD_MAJOR_MASK) >> COD_MAJOR_BIT_OFFSET)
-#define GET_COD_SERVICE(_cod) (((_cod) & COD_SERVICE_MASK) >> COD_SERVICE_BIT_OFFSET)
-
-#define SET_COD_MINOR(_cod, _minor) (_cod) = ((_cod) & ~COD_MINOR_MASK) | ((_minor) << COD_MINOR_BIT_OFFSET)
-#define SET_COD_MAJOR(_cod, _major) (_cod) = ((_cod) & ~COD_MAJOR_MASK) | ((_major) << COD_MAJOR_BIT_OFFSET)
-#define SET_COD_SERVICE(_cod, _service) (_cod) = ((_cod) & ~COD_SERVICE_MASK) | ((_service) << COD_SERVICE_BIT_OFFSET)
-
-#define COD_VERSION (0x0)
-
-#define COD_SERVICE_LIMITED (0x0001)
-#define COD_SERVICE_POSITIONING (0x0008)
-#define COD_SERVICE_NETWORKING (0x0010)
-#define COD_SERVICE_RENDERING (0x0020)
-#define COD_SERVICE_CAPTURING (0x0040)
-#define COD_SERVICE_OBJECT_XFER (0x0080)
-#define COD_SERVICE_AUDIO (0x0100)
-#define COD_SERVICE_TELEPHONY (0x0200)
-#define COD_SERVICE_INFORMATION (0x0400)
-
-#define COD_SERVICE_VALID_MASK (COD_SERVICE_LIMITED | \
- COD_SERVICE_POSITIONING | \
- COD_SERVICE_NETWORKING | \
- COD_SERVICE_RENDERING | \
- COD_SERVICE_CAPTURING | \
- COD_SERVICE_OBJECT_XFER |\
- COD_SERVICE_AUDIO |\
- COD_SERVICE_TELEPHONY |\
- COD_SERVICE_INFORMATION)
-
-#define COD_SERVICE_MAX_COUNT (9)
-
-//
-// Major class codes
-//
-#define COD_MAJOR_MISCELLANEOUS (0x00)
-#define COD_MAJOR_COMPUTER (0x01)
-#define COD_MAJOR_PHONE (0x02)
-#define COD_MAJOR_LAN_ACCESS (0x03)
-#define COD_MAJOR_AUDIO (0x04)
-#define COD_MAJOR_PERIPHERAL (0x05)
-#define COD_MAJOR_IMAGING (0x06)
-#define COD_MAJOR_UNCLASSIFIED (0x1F)
-
-//
-// Minor class codes specific to each major class
-//
-#define COD_COMPUTER_MINOR_UNCLASSIFIED (0x00)
-#define COD_COMPUTER_MINOR_DESKTOP (0x01)
-#define COD_COMPUTER_MINOR_SERVER (0x02)
-#define COD_COMPUTER_MINOR_LAPTOP (0x03)
-#define COD_COMPUTER_MINOR_HANDHELD (0x04)
-#define COD_COMPUTER_MINOR_PALM (0x05)
-#define COD_COMPUTER_MINOR_WEARABLE (0x06)
-
-#define COD_PHONE_MINOR_UNCLASSIFIED (0x00)
-#define COD_PHONE_MINOR_CELLULAR (0x01)
-#define COD_PHONE_MINOR_CORDLESS (0x02)
-#define COD_PHONE_MINOR_SMART (0x03)
-#define COD_PHONE_MINOR_WIRED_MODEM (0x04)
-
-#define COD_AUDIO_MINOR_UNCLASSIFIED (0x00)
-#define COD_AUDIO_MINOR_HEADSET (0x01)
-#define COD_AUDIO_MINOR_HANDS_FREE (0x02)
-#define COD_AUDIO_MINOR_HEADSET_HANDS_FREE (0x03)
-#define COD_AUDIO_MINOR_MICROPHONE (0x04)
-#define COD_AUDIO_MINOR_LOUDSPEAKER (0x05)
-#define COD_AUDIO_MINOR_HEADPHONES (0x06)
-#define COD_AUDIO_MINOR_PORTABLE_AUDIO (0x07)
-#define COD_AUDIO_MINOR_CAR_AUDIO (0x08)
-#define COD_AUDIO_MINOR_SET_TOP_BOX (0x09)
-#define COD_AUDIO_MINOR_HIFI_AUDIO (0x0A)
-#define COD_AUDIO_MINOR_VCR (0x0B)
-#define COD_AUDIO_MINOR_VIDEO_CAMERA (0x0C)
-#define COD_AUDIO_MINOR_CAMCORDER (0x0D)
-#define COD_AUDIO_MINOR_VIDEO_MONITOR (0x0E)
-#define COD_AUDIO_MINOR_VIDEO_DISPLAY_LOUDSPEAKER \
- (0x0F)
-#define COD_AUDIO_MINOR_VIDEO_DISPLAY_CONFERENCING \
- (0x10)
-// #define COD_AUDIO_MINOR_RESERVED (0x11)
-#define COD_AUDIO_MINOR_GAMING_TOY (0x12)
-
-#define COD_PERIPHERAL_MINOR_KEYBOARD_MASK (0x10)
-#define COD_PERIPHERAL_MINOR_POINTER_MASK (0x20)
-
-#define COD_PERIPHERAL_MINOR_NO_CATEGORY (0x00)
-#define COD_PERIPHERAL_MINOR_JOYSTICK (0x01)
-#define COD_PERIPHERAL_MINOR_GAMEPAD (0x02)
-#define COD_PERIPHERAL_MINOR_REMOTE_CONTROL (0x03)
-#define COD_PERIPHERAL_MINOR_SENSING (0x04)
-
-#define COD_IMAGING_MINOR_DISPLAY_MASK (0x04)
-#define COD_IMAGING_MINOR_CAMERA_MASK (0x08)
-#define COD_IMAGING_MINOR_SCANNER_MASK (0x10)
-#define COD_IMAGING_MINOR_PRINTER_MASK (0x20)
-
-//
-// Cannot use GET_COD_MINOR for this b/c it is embedded in a different manner
-// than the rest of the major classes
-//
-
-#define COD_LAN_ACCESS_BIT_OFFSET (5)
-
-#define COD_LAN_MINOR_MASK (0x00001C)
-#define COD_LAN_ACCESS_MASK (0x0000E0)
-
-#define GET_COD_LAN_MINOR(_cod) (((_cod) & COD_LAN_MINOR_MASK) >> COD_MINOR_BIT_OFFSET)
-#define GET_COD_LAN_ACCESS(_cod) (((_cod) & COD_LAN_ACCESS_MASK) >> COD_LAN_ACCESS_BIT_OFFSET)
-
-//
-// LAN access percent usage subcodes
-//
-#define COD_LAN_MINOR_UNCLASSIFIED (0x00)
-
-#define COD_LAN_ACCESS_0_USED (0x00)
-#define COD_LAN_ACCESS_17_USED (0x01)
-#define COD_LAN_ACCESS_33_USED (0x02)
-#define COD_LAN_ACCESS_50_USED (0x03)
-#define COD_LAN_ACCESS_67_USED (0x04)
-#define COD_LAN_ACCESS_83_USED (0x05)
-#define COD_LAN_ACCESS_99_USED (0x06)
-#define COD_LAN_ACCESS_FULL (0x07)
-
-//
-// Used as an initializer of LAP_DATA
-//
-#define LAP_GIAC_INIT { 0x33, 0x8B, 0x9E }
-#define LAP_LIAC_INIT { 0x00, 0x8B, 0x9E }
-
-//
-// General Inquiry Access Code.
-//
-#define LAP_GIAC_VALUE (0x009E8B33)
-
-//
-// Limited Inquiry Access Code.
-//
-#define LAP_LIAC_VALUE (0x009E8B00)
-
-#define BTH_ADDR_IAC_FIRST (0x9E8B00)
-#define BTH_ADDR_IAC_LAST (0x9E8B3f)
-#define BTH_ADDR_LIAC (0x9E8B00)
-#define BTH_ADDR_GIAC (0x9E8B33)
-
-typedef UCHAR BTHSTATUS, *PBTHSTATUS;
-
-#define BTH_ERROR(_btStatus) ((_btStatus) != BTH_ERROR_SUCCESS)
-#define BTH_SUCCESS(_btStatus) ((_btStatus) == BTH_ERROR_SUCCESS)
-
-#define BTH_ERROR_SUCCESS (0x00)
-#define BTH_ERROR_UNKNOWN_HCI_COMMAND (0x01)
-#define BTH_ERROR_NO_CONNECTION (0x02)
-#define BTH_ERROR_HARDWARE_FAILURE (0x03)
-#define BTH_ERROR_PAGE_TIMEOUT (0x04)
-#define BTH_ERROR_AUTHENTICATION_FAILURE (0x05)
-#define BTH_ERROR_KEY_MISSING (0x06)
-#define BTH_ERROR_MEMORY_FULL (0x07)
-#define BTH_ERROR_CONNECTION_TIMEOUT (0x08)
-#define BTH_ERROR_MAX_NUMBER_OF_CONNECTIONS (0x09)
-#define BTH_ERROR_MAX_NUMBER_OF_SCO_CONNECTIONS (0x0a)
-#define BTH_ERROR_ACL_CONNECTION_ALREADY_EXISTS (0x0b)
-#define BTH_ERROR_COMMAND_DISALLOWED (0x0c)
-#define BTH_ERROR_HOST_REJECTED_LIMITED_RESOURCES (0x0d)
-#define BTH_ERROR_HOST_REJECTED_SECURITY_REASONS (0x0e)
-#define BTH_ERROR_HOST_REJECTED_PERSONAL_DEVICE (0x0f)
-#define BTH_ERROR_HOST_TIMEOUT (0x10)
-#define BTH_ERROR_UNSUPPORTED_FEATURE_OR_PARAMETER (0x11)
-#define BTH_ERROR_INVALID_HCI_PARAMETER (0x12)
-#define BTH_ERROR_REMOTE_USER_ENDED_CONNECTION (0x13)
-#define BTH_ERROR_REMOTE_LOW_RESOURCES (0x14)
-#define BTH_ERROR_REMOTE_POWERING_OFF (0x15)
-#define BTH_ERROR_LOCAL_HOST_TERMINATED_CONNECTION (0x16)
-#define BTH_ERROR_REPEATED_ATTEMPTS (0x17)
-#define BTH_ERROR_PAIRING_NOT_ALLOWED (0x18)
-#define BTH_ERROR_UKNOWN_LMP_PDU (0x19)
-#define BTH_ERROR_UNSUPPORTED_REMOTE_FEATURE (0x1a)
-#define BTH_ERROR_SCO_OFFSET_REJECTED (0x1b)
-#define BTH_ERROR_SCO_INTERVAL_REJECTED (0x1c)
-#define BTH_ERROR_SCO_AIRMODE_REJECTED (0x1d)
-#define BTH_ERROR_INVALID_LMP_PARAMETERS (0x1e)
-#define BTH_ERROR_UNSPECIFIED_ERROR (0x1f)
-#define BTH_ERROR_UNSUPPORTED_LMP_PARM_VALUE (0x20)
-#define BTH_ERROR_ROLE_CHANGE_NOT_ALLOWED (0x21)
-#define BTH_ERROR_LMP_RESPONSE_TIMEOUT (0x22)
-#define BTH_ERROR_LMP_TRANSACTION_COLLISION (0x23)
-#define BTH_ERROR_LMP_PDU_NOT_ALLOWED (0x24)
-#define BTH_ERROR_ENCRYPTION_MODE_NOT_ACCEPTABLE (0x25)
-#define BTH_ERROR_UNIT_KEY_NOT_USED (0x26)
-#define BTH_ERROR_QOS_IS_NOT_SUPPORTED (0x27)
-#define BTH_ERROR_INSTANT_PASSED (0x28)
-#define BTH_ERROR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED (0x29)
-
-#define BTH_ERROR_UNSPECIFIED (0xFF)
-
-//
-// Min, max, and default L2cap MTU.
-//
-#define L2CAP_MIN_MTU (48)
-#define L2CAP_MAX_MTU (0xFFFF)
-#define L2CAP_DEFAULT_MTU (672)
-
-//
-// Max l2cap signal size (48) - size of signal header (4)
-//
-#define MAX_L2CAP_PING_DATA_LENGTH (44)
-#define MAX_L2CAP_INFO_DATA_LENGTH (44)
-
-//
-// the following two structures provides information about
-// disocvered remote radios.
-//
-
-#define BDIF_ADDRESS (0x00000001)
-#define BDIF_COD (0x00000002)
-#define BDIF_NAME (0x00000004)
-#define BDIF_PAIRED (0x00000008)
-#define BDIF_PERSONAL (0x00000010)
-#define BDIF_CONNECTED (0x00000020)
-
-#define BDIF_VALID_FLAGS \
- (BDIF_ADDRESS | BDIF_COD | BDIF_NAME | BDIF_PAIRED | BDIF_PERSONAL | \
- BDIF_CONNECTED)
-
-typedef struct _BTH_DEVICE_INFO {
- //
- // Combination BDIF_Xxx flags
- //
- ULONG flags;
-
- //
- // Address of remote device.
- //
- BTH_ADDR address;
-
- //
- // Class Of Device.
- //
- BTH_COD classOfDevice;
-
- //
- // name of the device
- //
- CHAR name[BTH_MAX_NAME_SIZE];
-
-} BTH_DEVICE_INFO, *PBTH_DEVICE_INFO;
-
-//
-// Buffer associated with GUID_BLUETOOTH_RADIO_IN_RANGE
-//
-typedef struct _BTH_RADIO_IN_RANGE {
- //
- // Information about the remote radio
- //
- BTH_DEVICE_INFO deviceInfo;
-
- //
- // The previous flags value for the BTH_DEVICE_INFO. The receiver of this
- // notification can compare the deviceInfo.flags and previousDeviceFlags
- // to determine what has changed about this remote radio.
- //
- // For instance, if BDIF_NAME is set in deviceInfo.flags and not in
- // previousDeviceFlags, the remote radio's has just been retrieved.
- //
- ULONG previousDeviceFlags;
-
-} BTH_RADIO_IN_RANGE, *PBTH_RADIO_IN_RANGE;
-
-//
-// Buffer associated with GUID_BLUETOOTH_L2CAP_EVENT
-//
-typedef struct _BTH_L2CAP_EVENT_INFO {
- //
- // Remote radio address which the L2CAP event is associated with
- //
- BTH_ADDR bthAddress;
-
- //
- // The PSM that is either being connected to or disconnected from
- //
- USHORT psm;
-
- //
- // If != 0, then the channel has just been established. If == 0, then the
- // channel has been destroyed. Notifications for a destroyed channel will
- // only be sent for channels successfully established.
- //
- UCHAR connected;
-
- //
- // If != 0, then the local host iniated the l2cap connection. If == 0, then
- // the remote host initated the connection. This field is only valid if
- // connect is != 0.
- //
- UCHAR initiated;
-
-} BTH_L2CAP_EVENT_INFO, *PBTH_L2CAP_EVENT_INFO;
-
-#define HCI_CONNNECTION_TYPE_ACL (1)
-#define HCI_CONNNECTION_TYPE_SCO (2)
-
-//
-// Buffer associated with GUID_BLUETOOTH_HCI_EVENT
-//
-typedef struct _BTH_HCI_EVENT_INFO {
- //
- // Remote radio address which the HCI event is associated with
- //
- BTH_ADDR bthAddress;
-
- //
- // HCI_CONNNECTION_TYPE_XXX value
- //
- UCHAR connectionType;
-
- //
- // If != 0, then the underlying connection to the remote radio has just
- // been estrablished. If == 0, then the underlying conneciton has just been
- // destroyed.
- //
- UCHAR connected;
-
-} BTH_HCI_EVENT_INFO, *PBTH_HCI_EVENT_INFO;
-
-#define MAX_UUIDS_IN_QUERY (12)
-
-#define BTH_VID_DEFAULT_VALUE (0xFFFF)
-
-#define SDP_ERROR_INVALID_SDP_VERSION (0x0001)
-#define SDP_ERROR_INVALID_RECORD_HANDLE (0x0002)
-#define SDP_ERROR_INVALID_REQUEST_SYNTAX (0x0003)
-#define SDP_ERROR_INVALID_PDU_SIZE (0x0004)
-#define SDP_ERROR_INVALID_CONTINUATION_STATE (0x0005)
-#define SDP_ERROR_INSUFFICIENT_RESOURCES (0x0006)
-
-//
-// Defined by windows to handle server errors that are not described by the
-// above errors. Start at 0x0100 so we don't go anywhere near the spec
-// defined values.
-//
-
-//
-// Success, nothing went wrong
-//
-#define SDP_ERROR_SUCCESS ((SDP_ERROR) 0x0000)
-
-//
-// The SDP PDU or parameters other than the SDP stream response was not correct
-//
-#define SDP_ERROR_SERVER_INVALID_RESPONSE ((SDP_ERROR) 0x0100)
-
-//
-// The SDP response stream did not parse correctly.
-//
-#define SDP_ERROR_SERVER_RESPONSE_DID_NOT_PARSE ((SDP_ERROR) 0x0200)
-
-//
-// The SDP response stream was successfully parsed, but did not match the
-// required format for the query.
-//
-#define SDP_ERROR_SERVER_BAD_FORMAT ((SDP_ERROR) 0x0300)
-
-//
-// SDP was unable to send a continued query back to the server
-//
-#define SDP_ERROR_COULD_NOT_SEND_CONTINUE ((SDP_ERROR) 0x0400)
-
-//
-// Server sent a response that was too large to fit in the caller's buffer.
-//
-#define SDP_ERROR_RESPONSE_TOO_LARGE ((SDP_ERROR) 0x0500)
-
-
-#define SDP_ATTRIB_RECORD_HANDLE (0x0000)
-#define SDP_ATTRIB_CLASS_ID_LIST (0x0001)
-#define SDP_ATTRIB_RECORD_STATE (0x0002)
-#define SDP_ATTRIB_SERVICE_ID (0x0003)
-#define SDP_ATTRIB_PROTOCOL_DESCRIPTOR_LIST (0x0004)
-#define SDP_ATTRIB_BROWSE_GROUP_LIST (0x0005)
-#define SDP_ATTRIB_LANG_BASE_ATTRIB_ID_LIST (0x0006)
-#define SDP_ATTRIB_INFO_TIME_TO_LIVE (0x0007)
-#define SDP_ATTRIB_AVAILABILITY (0x0008)
-#define SDP_ATTRIB_PROFILE_DESCRIPTOR_LIST (0x0009)
-#define SDP_ATTRIB_DOCUMENTATION_URL (0x000A)
-#define SDP_ATTRIB_CLIENT_EXECUTABLE_URL (0x000B)
-#define SDP_ATTRIB_ICON_URL (0x000C)
-#define SDP_ATTRIB_ADDITIONAL_PROTOCOL_DESCRIPTOR_LIST \
- (0x000D)
-
-//
-// Attribute IDs in the range of 0x000D - 0x01FF are reserved for future use
-//
-#define SDP_ATTRIB_PROFILE_SPECIFIC (0x0200)
-
-#define LANG_BASE_LANGUAGE_INDEX (0x0000)
-#define LANG_BASE_ENCODING_INDEX (0x0001)
-#define LANG_BASE_OFFSET_INDEX (0x0002)
-#define LANG_DEFAULT_ID (0x0100)
-
-#define STRING_NAME_OFFSET (0x0000)
-#define STRING_DESCRIPTION_OFFSET (0x0001)
-#define STRING_PROVIDER_NAME_OFFSET (0x0002)
-
-#define SDP_ATTRIB_SDP_VERSION_NUMBER_LIST (0x0200)
-#define SDP_ATTRIB_SDP_DATABASE_STATE (0x0201)
-
-#define SDP_ATTRIB_BROWSE_GROUP_ID (0x0200)
-
-#define SDP_ATTRIB_CORDLESS_EXTERNAL_NETWORK (0x0301)
-
-#define SDP_ATTRIB_FAX_CLASS_1_SUPPORT (0x0302)
-#define SDP_ATTRIB_FAX_CLASS_2_0_SUPPORT (0x0303)
-#define SDP_ATTRIB_FAX_CLASS_2_SUPPORT (0x0304)
-#define SDP_ATTRIB_FAX_AUDIO_FEEDBACK_SUPPORT (0x0305)
-
-#define SDP_ATTRIB_HEADSET_REMOTE_AUDIO_VOLUME_CONTROL (0x0302)
-
-#define SDP_ATTRIB_LAN_LPSUBNET (0x0200)
-
-#define SDP_ATTRIB_OBJECT_PUSH_SUPPORTED_FORMATS_LIST (0x0303)
-
-#define SDP_ATTRIB_SYNCH_SUPPORTED_DATA_STORES_LIST (0x0301)
-
-// this is in the assigned numbers doc, but it does not show up in any profile
-#define SDP_ATTRIB_SERVICE_VERSION (0x0300)
-
-#define SDP_ATTRIB_PAN_NETWORK_ADDRESS (0x0306)
-#define SDP_ATTRIB_PAN_WAP_GATEWAY (0x0307)
-#define SDP_ATTRIB_PAN_HOME_PAGE_URL (0x0308)
-#define SDP_ATTRIB_PAN_WAP_STACK_TYPE (0x0309)
-#define SDP_ATTRIB_PAN_SECURITY_DESCRIPTION (0x030A)
-#define SDP_ATTRIB_PAN_NET_ACCESS_TYPE (0x030B)
-#define SDP_ATTRIB_PAN_MAX_NET_ACCESS_RATE (0x030C)
-
-#define SDP_ATTRIB_IMAGING_SUPPORTED_CAPABILITIES (0x0310)
-#define SDP_ATTRIB_IMAGING_SUPPORTED_FEATURES (0x0311)
-#define SDP_ATTRIB_IMAGING_SUPPORTED_FUNCTIONS (0x0312)
-#define SDP_ATTRIB_IMAGING_TOTAL_DATA_CAPACITY (0x0313)
-
-#define SDP_ATTRIB_DI_SPECIFICATION_ID (0x0200)
-#define SDP_ATTRIB_DI_VENDOR_ID (0x0201)
-#define SDP_ATTRIB_DI_PRODUCT_ID (0x0202)
-#define SDP_ATTRIB_DI_VERSION (0x0203)
-#define SDP_ATTRIB_DI_PRIMARY_RECORD (0x0204)
-#define SDP_ATTRIB_DI_VENDOR_ID_SOURCE (0x0205)
-
-#define SDP_ATTRIB_HID_DEVICE_RELEASE_NUMBER (0x0200)
-#define SDP_ATTRIB_HID_PARSER_VERSION (0x0201)
-#define SDP_ATTRIB_HID_DEVICE_SUBCLASS (0x0202)
-#define SDP_ATTRIB_HID_COUNTRY_CODE (0x0203)
-#define SDP_ATTRIB_HID_VIRTUAL_CABLE (0x0204)
-#define SDP_ATTRIB_HID_RECONNECT_INITIATE (0x0205)
-#define SDP_ATTRIB_HID_DESCRIPTOR_LIST (0x0206)
-#define SDP_ATTRIB_HID_LANG_ID_BASE_LIST (0x0207)
-#define SDP_ATTRIB_HID_SDP_DISABLE (0x0208)
-#define SDP_ATTRIB_HID_BATTERY_POWER (0x0209)
-#define SDP_ATTRIB_HID_REMOTE_WAKE (0x020A)
-#define SDP_ATTRIB_HID_REPORT_LIST (0x020B)
-#define SDP_ATTRIB_HID_SUPERVISION_TIMEOUT (0x020C)
-#define SDP_ATTRIB_HID_NORMALLY_CONNECTABLE (0x020D)
-#define SDP_ATTRIB_HID_BOOT_DEVICE (0x020E)
-
-//
-// Profile specific values
-//
-#define CORDLESS_EXTERNAL_NETWORK_PSTN (0x01)
-#define CORDLESS_EXTERNAL_NETWORK_ISDN (0x02)
-#define CORDLESS_EXTERNAL_NETWORK_GSM (0x03)
-#define CORDLESS_EXTERNAL_NETWORK_CDMA (0x04)
-#define CORDLESS_EXTERNAL_NETWORK_ANALOG_CELLULAR (0x05)
-#define CORDLESS_EXTERNAL_NETWORK_PACKET_SWITCHED (0x06)
-#define CORDLESS_EXTERNAL_NETWORK_OTHER (0x07)
-
-#define OBJECT_PUSH_FORMAT_VCARD_2_1 (0x01)
-#define OBJECT_PUSH_FORMAT_VCARD_3_0 (0x02)
-#define OBJECT_PUSH_FORMAT_VCAL_1_0 (0x03)
-#define OBJECT_PUSH_FORMAT_ICAL_2_0 (0x04)
-#define OBJECT_PUSH_FORMAT_VNOTE (0x05)
-#define OBJECT_PUSH_FORMAT_VMESSAGE (0x06)
-#define OBJECT_PUSH_FORMAT_ANY (0xFF)
-
-#define SYNCH_DATA_STORE_PHONEBOOK (0x01)
-#define SYNCH_DATA_STORE_CALENDAR (0x03)
-#define SYNCH_DATA_STORE_NOTES (0x05)
-#define SYNCH_DATA_STORE_MESSAGES (0x06)
-
-#define DI_VENDOR_ID_SOURCE_BLUETOOTH_SIG (0x0001)
-#define DI_VENDOR_ID_SOURCE_USB_IF (0x0002)
-
-#define PSM_SDP (0x0001)
-#define PSM_RFCOMM (0x0003)
-#define PSM_TCS_BIN (0x0005)
-#define PSM_TCS_BIN_CORDLESS (0x0007)
-#define PSM_BNEP (0x000F)
-#define PSM_HID_CONTROL (0x0011)
-#define PSM_HID_INTERRUPT (0x0013)
-#define PSM_AVCTP (0x0017)
-#define PSM_AVDTP (0x0019)
-#define PSM_UDI_C_PLANE (0x001D)
-
-//
-// Strings
-//
-#define STR_ADDR_FMTA "(%02x:%02x:%02x:%02x:%02x:%02x)"
-#define STR_ADDR_FMTW L"(%02x:%02x:%02x:%02x:%02x:%02x)"
-
-#define STR_ADDR_SHORT_FMTA "%04x%08x"
-#define STR_ADDR_SHORT_FMTW L"%04x%08x"
-
-#if defined(UNICODE) || defined(BTH_KERN)
-
-#define STR_ADDR_FMT STR_ADDR_FMTW
-#define STR_ADDR_SHORT_FMT STR_ADDR_SHORT_FMTW
-
-#else // UNICODE
-
-#define STR_ADDR_FMT STR_ADDR_FMTA
-#define STR_ADDR_SHORT_FMT STR_ADDR_SHORT_FMTA
-
-#endif // UNICODE
-
-#define GET_BITS(field,offset,mask) ( ( (field) >> (offset) ) & (mask) )
-#define GET_BIT(field,offset) ( GET_BITS(field,offset,0x1) )
-
-#define LMP_3_SLOT_PACKETS(x) (GET_BIT(x, 0))
-#define LMP_5_SLOT_PACKETS(x) (GET_BIT(x, 1))
-#define LMP_ENCRYPTION(x) (GET_BIT(x, 2))
-#define LMP_SLOT_OFFSET(x) (GET_BIT(x, 3))
-#define LMP_TIMING_ACCURACY(x) (GET_BIT(x, 4))
-#define LMP_SWITCH(x) (GET_BIT(x, 5))
-#define LMP_HOLD_MODE(x) (GET_BIT(x, 6))
-#define LMP_SNIFF_MODE(x) (GET_BIT(x, 7))
-#define LMP_PARK_MODE(x) (GET_BIT(x, 8))
-#define LMP_RSSI(x) (GET_BIT(x, 9))
-#define LMP_CHANNEL_QUALITY_DRIVEN_MODE(x) (GET_BIT(x,10))
-#define LMP_SCO_LINK(x) (GET_BIT(x,11))
-#define LMP_HV2_PACKETS(x) (GET_BIT(x,12))
-#define LMP_HV3_PACKETS(x) (GET_BIT(x,13))
-#define LMP_MU_LAW_LOG(x) (GET_BIT(x,14))
-#define LMP_A_LAW_LOG(x) (GET_BIT(x,15))
-#define LMP_CVSD(x) (GET_BIT(x,16))
-#define LMP_PAGING_SCHEME(x) (GET_BIT(x,17))
-#define LMP_POWER_CONTROL(x) (GET_BIT(x,18))
-#define LMP_TRANSPARENT_SCO_DATA(x) (GET_BIT(x,19))
-#define LMP_FLOW_CONTROL_LAG(x) (GET_BITS(x,20,0x3))
-
-#endif // GUID_DEFS_ONLY
-
-#endif // __BTHDEF_H__
diff --git a/cpp/Wiipair/include/bthsdpdef.h b/cpp/Wiipair/include/bthsdpdef.h
deleted file mode 100644
index d4027f1..0000000
--- a/cpp/Wiipair/include/bthsdpdef.h
+++ /dev/null
@@ -1,111 +0,0 @@
-#ifndef __BTHSDPDEF_H__
-#define __BTHSDPDEF_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct SDP_LARGE_INTEGER_16 {
- ULONGLONG LowPart;
- LONGLONG HighPart;
-};
-
-
-struct SDP_ULARGE_INTEGER_16 {
- ULONGLONG LowPart;
- ULONGLONG HighPart;
-};
-
-typedef struct SDP_ULARGE_INTEGER_16 SDP_ULARGE_INTEGER_16, *PSDP_ULARGE_INTEGER_16, *LPSDP_ULARGE_INTEGER_16;
-typedef struct SDP_LARGE_INTEGER_16 SDP_LARGE_INTEGER_16, *PSDP_LARGE_INTEGER_16, *LPSDP_LARGE_INTEGER_16;
-
-enum NodeContainerType {
- NodeContainerTypeSequence,
- NodeContainerTypeAlternative
-};
-
-typedef enum NodeContainerType NodeContainerType;
-
-typedef USHORT SDP_ERROR, *PSDP_ERROR;
-
-enum SDP_TYPE {
- SDP_TYPE_NIL = 0x00,
- SDP_TYPE_UINT = 0x01,
- SDP_TYPE_INT = 0x02,
- SDP_TYPE_UUID = 0x03,
- SDP_TYPE_STRING = 0x04,
- SDP_TYPE_BOOLEAN = 0x05,
- SDP_TYPE_SEQUENCE = 0x06,
- SDP_TYPE_ALTERNATIVE = 0x07,
- SDP_TYPE_URL = 0x08,
- SDP_TYPE_CONTAINER = 0x20
-};
-// 9 - 31 are reserved
-typedef enum SDP_TYPE SDP_TYPE;
-
-// allow for a little easier type checking / sizing for integers and UUIDs
-// ((SDP_ST_XXX & 0xF0) >> 4) == SDP_TYPE_XXX
-// size of the data (in bytes) is encoded as ((SDP_ST_XXX & 0xF0) >> 8)
-enum SDP_SPECIFICTYPE {
- SDP_ST_NONE = 0x0000,
-
- SDP_ST_UINT8 = 0x0010,
- SDP_ST_UINT16 = 0x0110,
- SDP_ST_UINT32 = 0x0210,
- SDP_ST_UINT64 = 0x0310,
- SDP_ST_UINT128 = 0x0410,
-
- SDP_ST_INT8 = 0x0020,
- SDP_ST_INT16 = 0x0120,
- SDP_ST_INT32 = 0x0220,
- SDP_ST_INT64 = 0x0320,
- SDP_ST_INT128 = 0x0420,
-
- SDP_ST_UUID16 = 0x0130,
- SDP_ST_UUID32 = 0x0220,
- SDP_ST_UUID128 = 0x0430
-};
-typedef enum SDP_SPECIFICTYPE SDP_SPECIFICTYPE;
-
-typedef struct _SdpAttributeRange {
- USHORT minAttribute;
- USHORT maxAttribute;
-} SdpAttributeRange;
-
-
-typedef
-#ifdef USE_MIDL_SYNTAX
- [switch_type(unsigned short)]
-#endif
- union SdpQueryUuidUnion {
-#ifdef USE_MIDL_SYNTAX
- [case(SDP_ST_UUID128)]
-#endif
- GUID uuid128;
-
-#ifdef USE_MIDL_SYNTAX
- [case(SDP_ST_UUID32)]
-#endif _NTDDK_
- ULONG uuid32;
-
-#ifdef USE_MIDL_SYNTAX
- [case(SDP_ST_UUID16)]
-#endif _NTDDK_
- USHORT uuid16;
-} SdpQueryUuidUnion;
-
-typedef struct _SdpQueryUuid {
-#ifdef USE_MIDL_SYNTAX
- [switch_is(uuidType)]
-#endif
- SdpQueryUuidUnion u;
-
- USHORT uuidType;
-} SdpQueryUuid;
-
-
-#ifdef __cplusplus
-};
-#endif
-
-#endif // __BTHSDPDEF_H__
diff --git a/cpp/Wiipair/include/strsafe.h b/cpp/Wiipair/include/strsafe.h
deleted file mode 100644
index f725eae..0000000
--- a/cpp/Wiipair/include/strsafe.h
+++ /dev/null
@@ -1,6611 +0,0 @@
-/******************************************************************
-* *
-* strsafe.h -- This module defines safer C library string *
-* routine replacements. These are meant to make C *
-* a bit more safe in reference to security and *
-* robustness *
-* *
-* Copyright (c) Microsoft Corp. All rights reserved. *
-* *
-******************************************************************/
-#ifndef _STRSAFE_H_INCLUDED_
-#define _STRSAFE_H_INCLUDED_
-#pragma once
-
-#include // for _vsnprintf, _vsnwprintf, getc, getwc
-#include // for memset
-#include // for va_start, etc.
-
-
-#ifndef _SIZE_T_DEFINED
-#ifdef _WIN64
-typedef unsigned __int64 size_t;
-#else
-typedef __w64 unsigned int size_t;
-#endif // !_WIN64
-#define _SIZE_T_DEFINED
-#endif // !_SIZE_T_DEFINED
-
-#if !defined(_WCHAR_T_DEFINED) && !defined(_NATIVE_WCHAR_T_DEFINED)
-typedef unsigned short wchar_t;
-#define _WCHAR_T_DEFINED
-#endif
-
-#ifndef _HRESULT_DEFINED
-#define _HRESULT_DEFINED
-typedef long HRESULT;
-#endif // !_HRESULT_DEFINED
-
-#ifndef SUCCEEDED
-#define SUCCEEDED(hr) ((HRESULT)(hr) >= 0)
-#endif
-
-#ifndef FAILED
-#define FAILED(hr) ((HRESULT)(hr) < 0)
-#endif
-
-#ifndef S_OK
-#define S_OK ((HRESULT)0x00000000L)
-#endif
-
-#ifdef __cplusplus
-#define _STRSAFE_EXTERN_C extern "C"
-#else
-#define _STRSAFE_EXTERN_C extern
-#endif
-
-// If you do not want to use these functions inline (and instead want to link w/ strsafe.lib), then
-// #define STRSAFE_LIB before including this header file.
-#if defined(STRSAFE_LIB)
-#define STRSAFEAPI _STRSAFE_EXTERN_C HRESULT __stdcall
-#pragma comment(lib, "strsafe.lib")
-#elif defined(STRSAFE_LIB_IMPL)
-#define STRSAFEAPI _STRSAFE_EXTERN_C HRESULT __stdcall
-#else
-#define STRSAFEAPI __inline HRESULT __stdcall
-#define STRSAFE_INLINE
-#endif
-
-// Some functions always run inline because they use stdin and we want to avoid building multiple
-// versions of strsafe lib depending on if you use msvcrt, libcmt, etc.
-#define STRSAFE_INLINE_API __inline HRESULT __stdcall
-
-// The user can request no "Cb" or no "Cch" fuctions, but not both!
-#if defined(STRSAFE_NO_CB_FUNCTIONS) && defined(STRSAFE_NO_CCH_FUNCTIONS)
-#error cannot specify both STRSAFE_NO_CB_FUNCTIONS and STRSAFE_NO_CCH_FUNCTIONS !!
-#endif
-
-// This should only be defined when we are building strsafe.lib
-#ifdef STRSAFE_LIB_IMPL
-#define STRSAFE_INLINE
-#endif
-
-
-// If both strsafe.h and ntstrsafe.h are included, only use definitions from one.
-#ifndef _NTSTRSAFE_H_INCLUDED_
-
-#define STRSAFE_MAX_CCH 2147483647 // max # of characters we support (same as INT_MAX)
-
-// Flags for controling the Ex functions
-//
-// STRSAFE_FILL_BYTE(0xFF) 0x000000FF // bottom byte specifies fill pattern
-#define STRSAFE_IGNORE_NULLS 0x00000100 // treat null as TEXT("") -- don't fault on NULL buffers
-#define STRSAFE_FILL_BEHIND_NULL 0x00000200 // fill in extra space behind the null terminator
-#define STRSAFE_FILL_ON_FAILURE 0x00000400 // on failure, overwrite pszDest with fill pattern and null terminate it
-#define STRSAFE_NULL_ON_FAILURE 0x00000800 // on failure, set *pszDest = TEXT('\0')
-#define STRSAFE_NO_TRUNCATION 0x00001000 // instead of returning a truncated result, copy/append nothing to pszDest and null terminate it
-
-#define STRSAFE_VALID_FLAGS (0x000000FF | STRSAFE_IGNORE_NULLS | STRSAFE_FILL_BEHIND_NULL | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)
-
-// helper macro to set the fill character and specify buffer filling
-#define STRSAFE_FILL_BYTE(x) ((unsigned long)((x & 0x000000FF) | STRSAFE_FILL_BEHIND_NULL))
-#define STRSAFE_FAILURE_BYTE(x) ((unsigned long)((x & 0x000000FF) | STRSAFE_FILL_ON_FAILURE))
-
-#define STRSAFE_GET_FILL_PATTERN(dwFlags) ((int)(dwFlags & 0x000000FF))
-
-#endif // _NTSTRSAFE_H_INCLUDED_
-
-// STRSAFE error return codes
-//
-#define STRSAFE_E_INSUFFICIENT_BUFFER ((HRESULT)0x8007007AL) // 0x7A = 122L = ERROR_INSUFFICIENT_BUFFER
-#define STRSAFE_E_INVALID_PARAMETER ((HRESULT)0x80070057L) // 0x57 = 87L = ERROR_INVALID_PARAMETER
-#define STRSAFE_E_END_OF_FILE ((HRESULT)0x80070026L) // 0x26 = 38L = ERROR_HANDLE_EOF
-
-// prototypes for the worker functions
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCopyWorkerA(char* pszDest, size_t cchDest, const char* pszSrc);
-STRSAFEAPI StringCopyWorkerW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc);
-STRSAFEAPI StringCopyExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, const char* pszSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCopyExWorkerW(wchar_t* pszDest, size_t cchDest, size_t cbDest, const wchar_t* pszSrc, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCopyNWorkerA(char* pszDest, size_t cchDest, const char* pszSrc, size_t cchSrc);
-STRSAFEAPI StringCopyNWorkerW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, size_t cchSrc);
-STRSAFEAPI StringCopyNExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, const char* pszSrc, size_t cchSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCopyNExWorkerW(wchar_t* pszDest, size_t cchDest, size_t cbDest, const wchar_t* pszSrc, size_t cchSrc, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCatWorkerA(char* pszDest, size_t cchDest, const char* pszSrc);
-STRSAFEAPI StringCatWorkerW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc);
-STRSAFEAPI StringCatExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, const char* pszSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCatExWorkerW(wchar_t* pszDest, size_t cchDest, size_t cbDest, const wchar_t* pszSrc, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCatNWorkerA(char* pszDest, size_t cchDest, const char* pszSrc, size_t cchMaxAppend);
-STRSAFEAPI StringCatNWorkerW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, size_t cchMaxAppend);
-STRSAFEAPI StringCatNExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, const char* pszSrc, size_t cchMaxAppend, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCatNExWorkerW(wchar_t* pszDest, size_t cchDest, size_t cbDest, const wchar_t* pszSrc, size_t cchMaxAppend, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-STRSAFEAPI StringVPrintfWorkerA(char* pszDest, size_t cchDest, const char* pszFormat, va_list argList);
-STRSAFEAPI StringVPrintfWorkerW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszFormat, va_list argList);
-STRSAFEAPI StringVPrintfExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags, const char* pszFormat, va_list argList);
-STRSAFEAPI StringVPrintfExWorkerW(wchar_t* pszDest, size_t cchDest, size_t cbDest, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags, const wchar_t* pszFormat, va_list argList);
-STRSAFEAPI StringLengthWorkerA(const char* psz, size_t cchMax, size_t* pcch);
-STRSAFEAPI StringLengthWorkerW(const wchar_t* psz, size_t cchMax, size_t* pcch);
-#endif // STRSAFE_INLINE
-
-#ifndef STRSAFE_LIB_IMPL
-// these functions are always inline
-STRSAFE_INLINE_API StringGetsExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-STRSAFE_INLINE_API StringGetsExWorkerW(wchar_t* pszDest, size_t cchDest, size_t cbDest, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-#endif
-
-#ifdef _NTSTRSAFE_H_INCLUDED_
-#pragma warning(push)
-#pragma warning(disable : 4995)
-#endif // _NTSTRSAFE_H_INCLUDED_
-
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchCopy(
- OUT LPTSTR pszDest,
- IN size_t cchDest,
- IN LPCTSTR pszSrc
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strcpy'.
- The size of the destination buffer (in characters) is a parameter and
- this function will not write past the end of this buffer and it will
- ALWAYS null terminate the destination buffer (unless it is zero length).
-
- This routine is not a replacement for strncpy. That function will pad the
- destination string with extra null termination characters if the count is
- greater than the length of the source string, and it will fail to null
- terminate the destination string if the source string length is greater
- than or equal to the count. You can not blindly use this instead of strncpy:
- it is common for code to use it to "patch" strings and you would introduce
- errors if the code started null terminating in the middle of the string.
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if the string was copied without truncation and null terminated,
- otherwise it will return a failure code. In failure cases as much of
- pszSrc will be copied to pszDest as possible, and pszDest will be null
- terminated.
-
-Arguments:
-
- pszDest - destination string
-
- cchDest - size of destination buffer in characters.
- length must be = (_tcslen(src) + 1) to hold all of the
- source including the null terminator
-
- pszSrc - source string which must be null terminated
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL. See StringCchCopyEx if you require
- the handling of NULL values.
-
-Return Value:
-
- S_OK - if there was source data and it was all copied and the
- resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the copy
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function.
-
---*/
-
-STRSAFEAPI StringCchCopyA(char* pszDest, size_t cchDest, const char* pszSrc);
-STRSAFEAPI StringCchCopyW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc);
-#ifdef UNICODE
-#define StringCchCopy StringCchCopyW
-#else
-#define StringCchCopy StringCchCopyA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCchCopyA(char* pszDest, size_t cchDest, const char* pszSrc)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCopyWorkerA(pszDest, cchDest, pszSrc);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCchCopyW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCopyWorkerW(pszDest, cchDest, pszSrc);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbCopy(
- OUT LPTSTR pszDest,
- IN size_t cbDest,
- IN LPCTSTR pszSrc
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strcpy'.
- The size of the destination buffer (in bytes) is a parameter and this
- function will not write past the end of this buffer and it will ALWAYS
- null terminate the destination buffer (unless it is zero length).
-
- This routine is not a replacement for strncpy. That function will pad the
- destination string with extra null termination characters if the count is
- greater than the length of the source string, and it will fail to null
- terminate the destination string if the source string length is greater
- than or equal to the count. You can not blindly use this instead of strncpy:
- it is common for code to use it to "patch" strings and you would introduce
- errors if the code started null terminating in the middle of the string.
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if the string was copied without truncation and null terminated,
- otherwise it will return a failure code. In failure cases as much of pszSrc
- will be copied to pszDest as possible, and pszDest will be null terminated.
-
-Arguments:
-
- pszDest - destination string
-
- cbDest - size of destination buffer in bytes.
- length must be = ((_tcslen(src) + 1) * sizeof(TCHAR)) to
- hold all of the source including the null terminator
-
- pszSrc - source string which must be null terminated
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL. See StringCbCopyEx if you require
- the handling of NULL values.
-
-Return Value:
-
- S_OK - if there was source data and it was all copied and the
- resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the copy
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function.
-
---*/
-
-STRSAFEAPI StringCbCopyA(char* pszDest, size_t cbDest, const char* pszSrc);
-STRSAFEAPI StringCbCopyW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc);
-#ifdef UNICODE
-#define StringCbCopy StringCbCopyW
-#else
-#define StringCbCopy StringCbCopyA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCbCopyA(char* pszDest, size_t cbDest, const char* pszSrc)
-{
- HRESULT hr;
- size_t cchDest;
-
- // convert to count of characters
- cchDest = cbDest / sizeof(char);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCopyWorkerA(pszDest, cchDest, pszSrc);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCbCopyW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc)
-{
- HRESULT hr;
- size_t cchDest;
-
- // convert to count of characters
- cchDest = cbDest / sizeof(wchar_t);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCopyWorkerW(pszDest, cchDest, pszSrc);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchCopyEx(
- OUT LPTSTR pszDest OPTIONAL,
- IN size_t cchDest,
- IN LPCTSTR pszSrc OPTIONAL,
- OUT LPTSTR* ppszDestEnd OPTIONAL,
- OUT size_t* pcchRemaining OPTIONAL,
- IN DWORD dwFlags
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strcpy' with
- some additional parameters. In addition to functionality provided by
- StringCchCopy, this routine also returns a pointer to the end of the
- destination string and the number of characters left in the destination string
- including the null terminator. The flags parameter allows additional controls.
-
-Arguments:
-
- pszDest - destination string
-
- cchDest - size of destination buffer in characters.
- length must be = (_tcslen(pszSrc) + 1) to hold all of
- the source including the null terminator
-
- pszSrc - source string which must be null terminated
-
- ppszDestEnd - if ppszDestEnd is non-null, the function will return a
- pointer to the end of the destination string. If the
- function copied any data, the result will point to the
- null termination character
-
- pcchRemaining - if pcchRemaining is non-null, the function will return the
- number of characters left in the destination string,
- including the null terminator
-
- dwFlags - controls some details of the string copy:
-
- STRSAFE_FILL_BEHIND_NULL
- if the function succeeds, the low byte of dwFlags will be
- used to fill the uninitialize part of destination buffer
- behind the null terminator
-
- STRSAFE_IGNORE_NULLS
- treat NULL string pointers like empty strings (TEXT("")).
- this flag is useful for emulating functions like lstrcpy
-
- STRSAFE_FILL_ON_FAILURE
- if the function fails, the low byte of dwFlags will be
- used to fill all of the destination buffer, and it will
- be null terminated. This will overwrite any truncated
- string returned when the failure is
- STRSAFE_E_INSUFFICIENT_BUFFER
-
- STRSAFE_NO_TRUNCATION /
- STRSAFE_NULL_ON_FAILURE
- if the function fails, the destination buffer will be set
- to the empty string. This will overwrite any truncated string
- returned when the failure is STRSAFE_E_INSUFFICIENT_BUFFER.
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag
- is specified. If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc
- may be NULL. An error may still be returned even though NULLS are ignored
- due to insufficient space.
-
-Return Value:
-
- S_OK - if there was source data and it was all copied and the
- resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the copy
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCchCopyExA(char* pszDest, size_t cchDest, const char* pszSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCchCopyExW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-#ifdef UNICODE
-#define StringCchCopyEx StringCchCopyExW
-#else
-#define StringCchCopyEx StringCchCopyExA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCchCopyExA(char* pszDest, size_t cchDest, const char* pszSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
-
- // safe to multiply cchDest * sizeof(char) since cchDest < STRSAFE_MAX_CCH and sizeof(char) is 1
- cbDest = cchDest * sizeof(char);
-
- hr = StringCopyExWorkerA(pszDest, cchDest, cbDest, pszSrc, ppszDestEnd, pcchRemaining, dwFlags);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCchCopyExW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
-
- // safe to multiply cchDest * sizeof(wchar_t) since cchDest < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- cbDest = cchDest * sizeof(wchar_t);
-
- hr = StringCopyExWorkerW(pszDest, cchDest, cbDest, pszSrc, ppszDestEnd, pcchRemaining, dwFlags);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbCopyEx(
- OUT LPTSTR pszDest OPTIONAL,
- IN size_t cbDest,
- IN LPCTSTR pszSrc OPTIONAL,
- OUT LPTSTR* ppszDestEnd OPTIONAL,
- OUT size_t* pcbRemaining OPTIONAL,
- IN DWORD dwFlags
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strcpy' with
- some additional parameters. In addition to functionality provided by
- StringCbCopy, this routine also returns a pointer to the end of the
- destination string and the number of bytes left in the destination string
- including the null terminator. The flags parameter allows additional controls.
-
-Arguments:
-
- pszDest - destination string
-
- cbDest - size of destination buffer in bytes.
- length must be ((_tcslen(pszSrc) + 1) * sizeof(TCHAR)) to
- hold all of the source including the null terminator
-
- pszSrc - source string which must be null terminated
-
- ppszDestEnd - if ppszDestEnd is non-null, the function will return a
- pointer to the end of the destination string. If the
- function copied any data, the result will point to the
- null termination character
-
- pcbRemaining - pcbRemaining is non-null,the function will return the
- number of bytes left in the destination string,
- including the null terminator
-
- dwFlags - controls some details of the string copy:
-
- STRSAFE_FILL_BEHIND_NULL
- if the function succeeds, the low byte of dwFlags will be
- used to fill the uninitialize part of destination buffer
- behind the null terminator
-
- STRSAFE_IGNORE_NULLS
- treat NULL string pointers like empty strings (TEXT("")).
- this flag is useful for emulating functions like lstrcpy
-
- STRSAFE_FILL_ON_FAILURE
- if the function fails, the low byte of dwFlags will be
- used to fill all of the destination buffer, and it will
- be null terminated. This will overwrite any truncated
- string returned when the failure is
- STRSAFE_E_INSUFFICIENT_BUFFER
-
- STRSAFE_NO_TRUNCATION /
- STRSAFE_NULL_ON_FAILURE
- if the function fails, the destination buffer will be set
- to the empty string. This will overwrite any truncated string
- returned when the failure is STRSAFE_E_INSUFFICIENT_BUFFER.
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag
- is specified. If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc
- may be NULL. An error may still be returned even though NULLS are ignored
- due to insufficient space.
-
-Return Value:
-
- S_OK - if there was source data and it was all copied and the
- resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the copy
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCbCopyExA(char* pszDest, size_t cbDest, const char* pszSrc, char** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCbCopyExW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc, wchar_t** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags);
-#ifdef UNICODE
-#define StringCbCopyEx StringCbCopyExW
-#else
-#define StringCbCopyEx StringCbCopyExA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCbCopyExA(char* pszDest, size_t cbDest, const char* pszSrc, char** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchRemaining = 0;
-
- cchDest = cbDest / sizeof(char);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCopyExWorkerA(pszDest, cchDest, cbDest, pszSrc, ppszDestEnd, &cchRemaining, dwFlags);
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (pcbRemaining)
- {
- // safe to multiply cchRemaining * sizeof(char) since cchRemaining < STRSAFE_MAX_CCH and sizeof(char) is 1
- *pcbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCbCopyExW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc, wchar_t** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchRemaining = 0;
-
- cchDest = cbDest / sizeof(wchar_t);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCopyExWorkerW(pszDest, cchDest, cbDest, pszSrc, ppszDestEnd, &cchRemaining, dwFlags);
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (pcbRemaining)
- {
- // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- *pcbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
- }
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchCopyN(
- OUT LPTSTR pszDest,
- IN size_t cchDest,
- IN LPCTSTR pszSrc,
- IN size_t cchSrc
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strncpy'.
- The size of the destination buffer (in characters) is a parameter and
- this function will not write past the end of this buffer and it will
- ALWAYS null terminate the destination buffer (unless it is zero length).
-
- This routine is meant as a replacement for strncpy, but it does behave
- differently. This function will not pad the destination buffer with extra
- null termination characters if cchSrc is greater than the length of pszSrc.
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if the entire string or the first cchSrc characters were copied
- without truncation and the resultant destination string was null terminated,
- otherwise it will return a failure code. In failure cases as much of pszSrc
- will be copied to pszDest as possible, and pszDest will be null terminated.
-
-Arguments:
-
- pszDest - destination string
-
- cchDest - size of destination buffer in characters.
- length must be = (_tcslen(src) + 1) to hold all of the
- source including the null terminator
-
- pszSrc - source string
-
- cchSrc - maximum number of characters to copy from source string,
- not including the null terminator.
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL. See StringCchCopyNEx if you require
- the handling of NULL values.
-
-Return Value:
-
- S_OK - if there was source data and it was all copied and the
- resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the copy
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function.
-
---*/
-
-STRSAFEAPI StringCchCopyNA(char* pszDest, size_t cchDest, const char* pszSrc, size_t cchSrc);
-STRSAFEAPI StringCchCopyNW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, size_t cchSrc);
-#ifdef UNICODE
-#define StringCchCopyN StringCchCopyNW
-#else
-#define StringCchCopyN StringCchCopyNA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCchCopyNA(char* pszDest, size_t cchDest, const char* pszSrc, size_t cchSrc)
-{
- HRESULT hr;
-
- if ((cchDest > STRSAFE_MAX_CCH) ||
- (cchSrc > STRSAFE_MAX_CCH))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCopyNWorkerA(pszDest, cchDest, pszSrc, cchSrc);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCchCopyNW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, size_t cchSrc)
-{
- HRESULT hr;
-
- if ((cchDest > STRSAFE_MAX_CCH) ||
- (cchSrc > STRSAFE_MAX_CCH))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCopyNWorkerW(pszDest, cchDest, pszSrc, cchSrc);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbCopyN(
- OUT LPTSTR pszDest,
- IN size_t cbDest,
- IN LPCTSTR pszSrc,
- IN size_t cbSrc
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strncpy'.
- The size of the destination buffer (in bytes) is a parameter and this
- function will not write past the end of this buffer and it will ALWAYS
- null terminate the destination buffer (unless it is zero length).
-
- This routine is meant as a replacement for strncpy, but it does behave
- differently. This function will not pad the destination buffer with extra
- null termination characters if cbSrc is greater than the size of pszSrc.
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if the entire string or the first cbSrc characters were
- copied without truncation and the resultant destination string was null
- terminated, otherwise it will return a failure code. In failure cases as
- much of pszSrc will be copied to pszDest as possible, and pszDest will be
- null terminated.
-
-Arguments:
-
- pszDest - destination string
-
- cbDest - size of destination buffer in bytes.
- length must be = ((_tcslen(src) + 1) * sizeof(TCHAR)) to
- hold all of the source including the null terminator
-
- pszSrc - source string
-
- cbSrc - maximum number of bytes to copy from source string,
- not including the null terminator.
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL. See StringCbCopyEx if you require
- the handling of NULL values.
-
-Return Value:
-
- S_OK - if there was source data and it was all copied and the
- resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the copy
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function.
-
---*/
-
-STRSAFEAPI StringCbCopyNA(char* pszDest, size_t cbDest, const char* pszSrc, size_t cbSrc);
-STRSAFEAPI StringCbCopyNW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc, size_t cbSrc);
-#ifdef UNICODE
-#define StringCbCopyN StringCbCopyNW
-#else
-#define StringCbCopyN StringCbCopyNA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCbCopyNA(char* pszDest, size_t cbDest, const char* pszSrc, size_t cbSrc)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchSrc;
-
- // convert to count of characters
- cchDest = cbDest / sizeof(char);
- cchSrc = cbSrc / sizeof(char);
-
- if ((cchDest > STRSAFE_MAX_CCH) ||
- (cchSrc > STRSAFE_MAX_CCH))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCopyNWorkerA(pszDest, cchDest, pszSrc, cchSrc);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCbCopyNW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc, size_t cbSrc)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchSrc;
-
- // convert to count of characters
- cchDest = cbDest / sizeof(wchar_t);
- cchSrc = cbSrc / sizeof(wchar_t);
-
- if ((cchDest > STRSAFE_MAX_CCH) ||
- (cchSrc > STRSAFE_MAX_CCH))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCopyNWorkerW(pszDest, cchDest, pszSrc, cchSrc);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchCopyNEx(
- OUT LPTSTR pszDest OPTIONAL,
- IN size_t cchDest,
- IN LPCTSTR pszSrc OPTIONAL,
- IN size_t cchSrc,
- OUT LPTSTR* ppszDestEnd OPTIONAL,
- OUT size_t* pcchRemaining OPTIONAL,
- IN DWORD dwFlags
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strncpy' with
- some additional parameters. In addition to functionality provided by
- StringCchCopyN, this routine also returns a pointer to the end of the
- destination string and the number of characters left in the destination
- string including the null terminator. The flags parameter allows
- additional controls.
-
- This routine is meant as a replacement for strncpy, but it does behave
- differently. This function will not pad the destination buffer with extra
- null termination characters if cchSrc is greater than the length of pszSrc.
-
-Arguments:
-
- pszDest - destination string
-
- cchDest - size of destination buffer in characters.
- length must be = (_tcslen(pszSrc) + 1) to hold all of
- the source including the null terminator
-
- pszSrc - source string
-
- cchSrc - maximum number of characters to copy from the source
- string
-
- ppszDestEnd - if ppszDestEnd is non-null, the function will return a
- pointer to the end of the destination string. If the
- function copied any data, the result will point to the
- null termination character
-
- pcchRemaining - if pcchRemaining is non-null, the function will return the
- number of characters left in the destination string,
- including the null terminator
-
- dwFlags - controls some details of the string copy:
-
- STRSAFE_FILL_BEHIND_NULL
- if the function succeeds, the low byte of dwFlags will be
- used to fill the uninitialize part of destination buffer
- behind the null terminator
-
- STRSAFE_IGNORE_NULLS
- treat NULL string pointers like empty strings (TEXT("")).
- this flag is useful for emulating functions like lstrcpy
-
- STRSAFE_FILL_ON_FAILURE
- if the function fails, the low byte of dwFlags will be
- used to fill all of the destination buffer, and it will
- be null terminated. This will overwrite any truncated
- string returned when the failure is
- STRSAFE_E_INSUFFICIENT_BUFFER
-
- STRSAFE_NO_TRUNCATION /
- STRSAFE_NULL_ON_FAILURE
- if the function fails, the destination buffer will be set
- to the empty string. This will overwrite any truncated string
- returned when the failure is STRSAFE_E_INSUFFICIENT_BUFFER.
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag
- is specified. If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc
- may be NULL. An error may still be returned even though NULLS are ignored
- due to insufficient space.
-
-Return Value:
-
- S_OK - if there was source data and it was all copied and the
- resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the copy
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCchCopyNExA(char* pszDest, size_t cchDest, const char* pszSrc, size_t cchSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCchCopyNExW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, size_t cchSrc, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-#ifdef UNICODE
-#define StringCchCopyNEx StringCchCopyNExW
-#else
-#define StringCchCopyNEx StringCchCopyNExA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCchCopyNExA(char* pszDest, size_t cchDest, const char* pszSrc, size_t cchSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
-
- if ((cchDest > STRSAFE_MAX_CCH) ||
- (cchSrc > STRSAFE_MAX_CCH))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
-
- // safe to multiply cchDest * sizeof(char) since cchDest < STRSAFE_MAX_CCH and sizeof(char) is 1
- cbDest = cchDest * sizeof(char);
-
- hr = StringCopyNExWorkerA(pszDest, cchDest, cbDest, pszSrc, cchSrc, ppszDestEnd, pcchRemaining, dwFlags);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCchCopyNExW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, size_t cchSrc, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
-
- if ((cchDest > STRSAFE_MAX_CCH) ||
- (cchSrc > STRSAFE_MAX_CCH))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
-
- // safe to multiply cchDest * sizeof(wchar_t) since cchDest < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- cbDest = cchDest * sizeof(wchar_t);
-
- hr = StringCopyNExWorkerW(pszDest, cchDest, cbDest, pszSrc, cchSrc, ppszDestEnd, pcchRemaining, dwFlags);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbCopyNEx(
- OUT LPTSTR pszDest OPTIONAL,
- IN size_t cbDest,
- IN LPCTSTR pszSrc OPTIONAL,
- IN size_t cbSrc,
- OUT LPTSTR* ppszDestEnd OPTIONAL,
- OUT size_t* pcbRemaining OPTIONAL,
- IN DWORD dwFlags
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strncpy' with
- some additional parameters. In addition to functionality provided by
- StringCbCopyN, this routine also returns a pointer to the end of the
- destination string and the number of bytes left in the destination string
- including the null terminator. The flags parameter allows additional controls.
-
- This routine is meant as a replacement for strncpy, but it does behave
- differently. This function will not pad the destination buffer with extra
- null termination characters if cbSrc is greater than the size of pszSrc.
-
-Arguments:
-
- pszDest - destination string
-
- cbDest - size of destination buffer in bytes.
- length must be ((_tcslen(pszSrc) + 1) * sizeof(TCHAR)) to
- hold all of the source including the null terminator
-
- pszSrc - source string
-
- cbSrc - maximum number of bytes to copy from source string
-
- ppszDestEnd - if ppszDestEnd is non-null, the function will return a
- pointer to the end of the destination string. If the
- function copied any data, the result will point to the
- null termination character
-
- pcbRemaining - pcbRemaining is non-null,the function will return the
- number of bytes left in the destination string,
- including the null terminator
-
- dwFlags - controls some details of the string copy:
-
- STRSAFE_FILL_BEHIND_NULL
- if the function succeeds, the low byte of dwFlags will be
- used to fill the uninitialize part of destination buffer
- behind the null terminator
-
- STRSAFE_IGNORE_NULLS
- treat NULL string pointers like empty strings (TEXT("")).
- this flag is useful for emulating functions like lstrcpy
-
- STRSAFE_FILL_ON_FAILURE
- if the function fails, the low byte of dwFlags will be
- used to fill all of the destination buffer, and it will
- be null terminated. This will overwrite any truncated
- string returned when the failure is
- STRSAFE_E_INSUFFICIENT_BUFFER
-
- STRSAFE_NO_TRUNCATION /
- STRSAFE_NULL_ON_FAILURE
- if the function fails, the destination buffer will be set
- to the empty string. This will overwrite any truncated string
- returned when the failure is STRSAFE_E_INSUFFICIENT_BUFFER.
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag
- is specified. If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc
- may be NULL. An error may still be returned even though NULLS are ignored
- due to insufficient space.
-
-Return Value:
-
- S_OK - if there was source data and it was all copied and the
- resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the copy
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCbCopyNExA(char* pszDest, size_t cbDest, const char* pszSrc, size_t cbSrc, char** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCbCopyNExW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc, size_t cbSrc, wchar_t** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags);
-#ifdef UNICODE
-#define StringCbCopyNEx StringCbCopyNExW
-#else
-#define StringCbCopyNEx StringCbCopyNExA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCbCopyNExA(char* pszDest, size_t cbDest, const char* pszSrc, size_t cbSrc, char** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchSrc;
- size_t cchRemaining = 0;
-
- cchDest = cbDest / sizeof(char);
- cchSrc = cbSrc / sizeof(char);
-
- if ((cchDest > STRSAFE_MAX_CCH) ||
- (cchSrc > STRSAFE_MAX_CCH))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCopyNExWorkerA(pszDest, cchDest, cbDest, pszSrc, cchSrc, ppszDestEnd, &cchRemaining, dwFlags);
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (pcbRemaining)
- {
- // safe to multiply cchRemaining * sizeof(char) since cchRemaining < STRSAFE_MAX_CCH and sizeof(char) is 1
- *pcbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCbCopyNExW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc, size_t cbSrc, wchar_t** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchSrc;
- size_t cchRemaining = 0;
-
- cchDest = cbDest / sizeof(wchar_t);
- cchSrc = cbSrc / sizeof(wchar_t);
-
- if ((cchDest > STRSAFE_MAX_CCH) ||
- (cchSrc > STRSAFE_MAX_CCH))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCopyNExWorkerW(pszDest, cchDest, cbDest, pszSrc, cchSrc, ppszDestEnd, &cchRemaining, dwFlags);
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (pcbRemaining)
- {
- // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- *pcbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
- }
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchCat(
- IN OUT LPTSTR pszDest,
- IN size_t cchDest,
- IN LPCTSTR pszSrc
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strcat'.
- The size of the destination buffer (in characters) is a parameter and this
- function will not write past the end of this buffer and it will ALWAYS
- null terminate the destination buffer (unless it is zero length).
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if the string was concatenated without truncation and null terminated,
- otherwise it will return a failure code. In failure cases as much of pszSrc
- will be appended to pszDest as possible, and pszDest will be null
- terminated.
-
-Arguments:
-
- pszDest - destination string which must be null terminated
-
- cchDest - size of destination buffer in characters.
- length must be = (_tcslen(pszDest) + _tcslen(pszSrc) + 1)
- to hold all of the combine string plus the null
- terminator
-
- pszSrc - source string which must be null terminated
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL. See StringCchCatEx if you require
- the handling of NULL values.
-
-Return Value:
-
- S_OK - if there was source data and it was all concatenated and
- the resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the operation
- failed due to insufficient space. When this error occurs,
- the destination buffer is modified to contain a truncated
- version of the ideal result and is null terminated. This
- is useful for situations where truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCchCatA(char* pszDest, size_t cchDest, const char* pszSrc);
-STRSAFEAPI StringCchCatW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc);
-#ifdef UNICODE
-#define StringCchCat StringCchCatW
-#else
-#define StringCchCat StringCchCatA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCchCatA(char* pszDest, size_t cchDest, const char* pszSrc)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCatWorkerA(pszDest, cchDest, pszSrc);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCchCatW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCatWorkerW(pszDest, cchDest, pszSrc);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbCat(
- IN OUT LPTSTR pszDest,
- IN size_t cbDest,
- IN LPCTSTR pszSrc
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strcat'.
- The size of the destination buffer (in bytes) is a parameter and this
- function will not write past the end of this buffer and it will ALWAYS
- null terminate the destination buffer (unless it is zero length).
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if the string was concatenated without truncation and null terminated,
- otherwise it will return a failure code. In failure cases as much of pszSrc
- will be appended to pszDest as possible, and pszDest will be null
- terminated.
-
-Arguments:
-
- pszDest - destination string which must be null terminated
-
- cbDest - size of destination buffer in bytes.
- length must be = ((_tcslen(pszDest) + _tcslen(pszSrc) + 1) * sizeof(TCHAR)
- to hold all of the combine string plus the null
- terminator
-
- pszSrc - source string which must be null terminated
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL. See StringCbCatEx if you require
- the handling of NULL values.
-
-Return Value:
-
- S_OK - if there was source data and it was all concatenated and
- the resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the operation
- failed due to insufficient space. When this error occurs,
- the destination buffer is modified to contain a truncated
- version of the ideal result and is null terminated. This
- is useful for situations where truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCbCatA(char* pszDest, size_t cbDest, const char* pszSrc);
-STRSAFEAPI StringCbCatW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc);
-#ifdef UNICODE
-#define StringCbCat StringCbCatW
-#else
-#define StringCbCat StringCbCatA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCbCatA(char* pszDest, size_t cbDest, const char* pszSrc)
-{
- HRESULT hr;
- size_t cchDest;
-
- cchDest = cbDest / sizeof(char);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCatWorkerA(pszDest, cchDest, pszSrc);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCbCatW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc)
-{
- HRESULT hr;
- size_t cchDest;
-
- cchDest = cbDest / sizeof(wchar_t);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCatWorkerW(pszDest, cchDest, pszSrc);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchCatEx(
- IN OUT LPTSTR pszDest OPTIONAL,
- IN size_t cchDest,
- IN LPCTSTR pszSrc OPTIONAL,
- OUT LPTSTR* ppszDestEnd OPTIONAL,
- OUT size_t* pcchRemaining OPTIONAL,
- IN DWORD dwFlags
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strcat' with
- some additional parameters. In addition to functionality provided by
- StringCchCat, this routine also returns a pointer to the end of the
- destination string and the number of characters left in the destination string
- including the null terminator. The flags parameter allows additional controls.
-
-Arguments:
-
- pszDest - destination string which must be null terminated
-
- cchDest - size of destination buffer in characters
- length must be (_tcslen(pszDest) + _tcslen(pszSrc) + 1)
- to hold all of the combine string plus the null
- terminator.
-
- pszSrc - source string which must be null terminated
-
- ppszDestEnd - if ppszDestEnd is non-null, the function will return a
- pointer to the end of the destination string. If the
- function appended any data, the result will point to the
- null termination character
-
- pcchRemaining - if pcchRemaining is non-null, the function will return the
- number of characters left in the destination string,
- including the null terminator
-
- dwFlags - controls some details of the string copy:
-
- STRSAFE_FILL_BEHIND_NULL
- if the function succeeds, the low byte of dwFlags will be
- used to fill the uninitialize part of destination buffer
- behind the null terminator
-
- STRSAFE_IGNORE_NULLS
- treat NULL string pointers like empty strings (TEXT("")).
- this flag is useful for emulating functions like lstrcat
-
- STRSAFE_FILL_ON_FAILURE
- if the function fails, the low byte of dwFlags will be
- used to fill all of the destination buffer, and it will
- be null terminated. This will overwrite any pre-existing
- or truncated string
-
- STRSAFE_NULL_ON_FAILURE
- if the function fails, the destination buffer will be set
- to the empty string. This will overwrite any pre-existing or
- truncated string
-
- STRSAFE_NO_TRUNCATION
- if the function returns STRSAFE_E_INSUFFICIENT_BUFFER, pszDest
- will not contain a truncated string, it will remain unchanged.
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag
- is specified. If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc
- may be NULL. An error may still be returned even though NULLS are ignored
- due to insufficient space.
-
-Return Value:
-
- S_OK - if there was source data and it was all concatenated and
- the resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the operation
- failed due to insufficient space. When this error
- occurs, the destination buffer is modified to contain
- a truncated version of the ideal result and is null
- terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCchCatExA(char* pszDest, size_t cchDest, const char* pszSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCchCatExW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-#ifdef UNICODE
-#define StringCchCatEx StringCchCatExW
-#else
-#define StringCchCatEx StringCchCatExA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCchCatExA(char* pszDest, size_t cchDest, const char* pszSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
-
- // safe to multiply cchDest * sizeof(char) since cchDest < STRSAFE_MAX_CCH and sizeof(char) is 1
- cbDest = cchDest * sizeof(char);
-
- hr = StringCatExWorkerA(pszDest, cchDest, cbDest, pszSrc, ppszDestEnd, pcchRemaining, dwFlags);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCchCatExW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
-
- // safe to multiply cchDest * sizeof(wchar_t) since cchDest < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- cbDest = cchDest * sizeof(wchar_t);
-
- hr = StringCatExWorkerW(pszDest, cchDest, cbDest, pszSrc, ppszDestEnd, pcchRemaining, dwFlags);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbCatEx(
- IN OUT LPTSTR pszDest OPTIONAL,
- IN size_t cbDest,
- IN LPCTSTR pszSrc OPTIONAL,
- OUT LPTSTR* ppszDestEnd OPTIONAL,
- OUT size_t* pcbRemaining OPTIONAL,
- IN DWORD dwFlags
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strcat' with
- some additional parameters. In addition to functionality provided by
- StringCbCat, this routine also returns a pointer to the end of the
- destination string and the number of bytes left in the destination string
- including the null terminator. The flags parameter allows additional controls.
-
-Arguments:
-
- pszDest - destination string which must be null terminated
-
- cbDest - size of destination buffer in bytes.
- length must be ((_tcslen(pszDest) + _tcslen(pszSrc) + 1) * sizeof(TCHAR)
- to hold all of the combine string plus the null
- terminator.
-
- pszSrc - source string which must be null terminated
-
- ppszDestEnd - if ppszDestEnd is non-null, the function will return a
- pointer to the end of the destination string. If the
- function appended any data, the result will point to the
- null termination character
-
- pcbRemaining - if pcbRemaining is non-null, the function will return
- the number of bytes left in the destination string,
- including the null terminator
-
- dwFlags - controls some details of the string copy:
-
- STRSAFE_FILL_BEHIND_NULL
- if the function succeeds, the low byte of dwFlags will be
- used to fill the uninitialize part of destination buffer
- behind the null terminator
-
- STRSAFE_IGNORE_NULLS
- treat NULL string pointers like empty strings (TEXT("")).
- this flag is useful for emulating functions like lstrcat
-
- STRSAFE_FILL_ON_FAILURE
- if the function fails, the low byte of dwFlags will be
- used to fill all of the destination buffer, and it will
- be null terminated. This will overwrite any pre-existing
- or truncated string
-
- STRSAFE_NULL_ON_FAILURE
- if the function fails, the destination buffer will be set
- to the empty string. This will overwrite any pre-existing or
- truncated string
-
- STRSAFE_NO_TRUNCATION
- if the function returns STRSAFE_E_INSUFFICIENT_BUFFER, pszDest
- will not contain a truncated string, it will remain unchanged.
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag
- is specified. If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc
- may be NULL. An error may still be returned even though NULLS are ignored
- due to insufficient space.
-
-Return Value:
-
- S_OK - if there was source data and it was all concatenated
- and the resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the operation
- failed due to insufficient space. When this error
- occurs, the destination buffer is modified to contain
- a truncated version of the ideal result and is null
- terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCbCatExA(char* pszDest, size_t cbDest, const char* pszSrc, char** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCbCatExW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc, wchar_t** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags);
-#ifdef UNICODE
-#define StringCbCatEx StringCbCatExW
-#else
-#define StringCbCatEx StringCbCatExA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCbCatExA(char* pszDest, size_t cbDest, const char* pszSrc, char** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchRemaining = 0;
-
- cchDest = cbDest / sizeof(char);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCatExWorkerA(pszDest, cchDest, cbDest, pszSrc, ppszDestEnd, &cchRemaining, dwFlags);
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (pcbRemaining)
- {
- // safe to multiply cchRemaining * sizeof(char) since cchRemaining < STRSAFE_MAX_CCH and sizeof(char) is 1
- *pcbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCbCatExW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc, wchar_t** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchRemaining = 0;
-
- cchDest = cbDest / sizeof(wchar_t);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCatExWorkerW(pszDest, cchDest, cbDest, pszSrc, ppszDestEnd, &cchRemaining, dwFlags);
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (pcbRemaining)
- {
- // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- *pcbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
- }
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchCatN(
- IN OUT LPTSTR pszDest,
- IN size_t cchDest,
- IN LPCTSTR pszSrc,
- IN size_t cchMaxAppend
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strncat'.
- The size of the destination buffer (in characters) is a parameter as well as
- the maximum number of characters to append, excluding the null terminator.
- This function will not write past the end of the destination buffer and it will
- ALWAYS null terminate pszDest (unless it is zero length).
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if all of pszSrc or the first cchMaxAppend characters were appended
- to the destination string and it was null terminated, otherwise it will
- return a failure code. In failure cases as much of pszSrc will be appended
- to pszDest as possible, and pszDest will be null terminated.
-
-Arguments:
-
- pszDest - destination string which must be null terminated
-
- cchDest - size of destination buffer in characters.
- length must be (_tcslen(pszDest) + min(cchMaxAppend, _tcslen(pszSrc)) + 1)
- to hold all of the combine string plus the null
- terminator.
-
- pszSrc - source string
-
- cchMaxAppend - maximum number of characters to append
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL. See StringCchCatNEx if you require
- the handling of NULL values.
-
-Return Value:
-
- S_OK - if all of pszSrc or the first cchMaxAppend characters
- were concatenated to pszDest and the resultant dest
- string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the operation
- failed due to insufficient space. When this error
- occurs, the destination buffer is modified to contain
- a truncated version of the ideal result and is null
- terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCchCatNA(char* pszDest, size_t cchDest, const char* pszSrc, size_t cchMaxAppend);
-STRSAFEAPI StringCchCatNW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, size_t cchMaxAppend);
-#ifdef UNICODE
-#define StringCchCatN StringCchCatNW
-#else
-#define StringCchCatN StringCchCatNA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCchCatNA(char* pszDest, size_t cchDest, const char* pszSrc, size_t cchMaxAppend)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCatNWorkerA(pszDest, cchDest, pszSrc, cchMaxAppend);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCchCatNW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, size_t cchMaxAppend)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringCatNWorkerW(pszDest, cchDest, pszSrc, cchMaxAppend);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbCatN(
- IN OUT LPTSTR pszDest,
- IN size_t cbDest,
- IN LPCTSTR pszSrc,
- IN size_t cbMaxAppend
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strncat'.
- The size of the destination buffer (in bytes) is a parameter as well as
- the maximum number of bytes to append, excluding the null terminator.
- This function will not write past the end of the destination buffer and it will
- ALWAYS null terminate pszDest (unless it is zero length).
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if all of pszSrc or the first cbMaxAppend bytes were appended
- to the destination string and it was null terminated, otherwise it will
- return a failure code. In failure cases as much of pszSrc will be appended
- to pszDest as possible, and pszDest will be null terminated.
-
-Arguments:
-
- pszDest - destination string which must be null terminated
-
- cbDest - size of destination buffer in bytes.
- length must be ((_tcslen(pszDest) + min(cbMaxAppend / sizeof(TCHAR), _tcslen(pszSrc)) + 1) * sizeof(TCHAR)
- to hold all of the combine string plus the null
- terminator.
-
- pszSrc - source string
-
- cbMaxAppend - maximum number of bytes to append
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL. See StringCbCatNEx if you require
- the handling of NULL values.
-
-Return Value:
-
- S_OK - if all of pszSrc or the first cbMaxAppend bytes were
- concatenated to pszDest and the resultant dest string
- was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the operation
- failed due to insufficient space. When this error
- occurs, the destination buffer is modified to contain
- a truncated version of the ideal result and is null
- terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCbCatNA(char* pszDest, size_t cbDest, const char* pszSrc, size_t cbMaxAppend);
-STRSAFEAPI StringCbCatNW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc, size_t cbMaxAppend);
-#ifdef UNICODE
-#define StringCbCatN StringCbCatNW
-#else
-#define StringCbCatN StringCbCatNA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCbCatNA(char* pszDest, size_t cbDest, const char* pszSrc, size_t cbMaxAppend)
-{
- HRESULT hr;
- size_t cchDest;
-
- cchDest = cbDest / sizeof(char);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cchMaxAppend;
-
- cchMaxAppend = cbMaxAppend / sizeof(char);
-
- hr = StringCatNWorkerA(pszDest, cchDest, pszSrc, cchMaxAppend);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCbCatNW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc, size_t cbMaxAppend)
-{
- HRESULT hr;
- size_t cchDest;
-
- cchDest = cbDest / sizeof(wchar_t);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cchMaxAppend;
-
- cchMaxAppend = cbMaxAppend / sizeof(wchar_t);
-
- hr = StringCatNWorkerW(pszDest, cchDest, pszSrc, cchMaxAppend);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchCatNEx(
- IN OUT LPTSTR pszDest OPTIONAL,
- IN size_t cchDest,
- IN LPCTSTR pszSrc OPTIONAL,
- IN size_t cchMaxAppend,
- OUT LPTSTR* ppszDestEnd OPTIONAL,
- OUT size_t* pcchRemaining OPTIONAL,
- IN DWORD dwFlags
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strncat', with
- some additional parameters. In addition to functionality provided by
- StringCchCatN, this routine also returns a pointer to the end of the
- destination string and the number of characters left in the destination string
- including the null terminator. The flags parameter allows additional controls.
-
-Arguments:
-
- pszDest - destination string which must be null terminated
-
- cchDest - size of destination buffer in characters.
- length must be (_tcslen(pszDest) + min(cchMaxAppend, _tcslen(pszSrc)) + 1)
- to hold all of the combine string plus the null
- terminator.
-
- pszSrc - source string
-
- cchMaxAppend - maximum number of characters to append
-
- ppszDestEnd - if ppszDestEnd is non-null, the function will return a
- pointer to the end of the destination string. If the
- function appended any data, the result will point to the
- null termination character
-
- pcchRemaining - if pcchRemaining is non-null, the function will return the
- number of characters left in the destination string,
- including the null terminator
-
- dwFlags - controls some details of the string copy:
-
- STRSAFE_FILL_BEHIND_NULL
- if the function succeeds, the low byte of dwFlags will be
- used to fill the uninitialize part of destination buffer
- behind the null terminator
-
- STRSAFE_IGNORE_NULLS
- treat NULL string pointers like empty strings (TEXT(""))
-
- STRSAFE_FILL_ON_FAILURE
- if the function fails, the low byte of dwFlags will be
- used to fill all of the destination buffer, and it will
- be null terminated. This will overwrite any pre-existing
- or truncated string
-
- STRSAFE_NULL_ON_FAILURE
- if the function fails, the destination buffer will be set
- to the empty string. This will overwrite any pre-existing or
- truncated string
-
- STRSAFE_NO_TRUNCATION
- if the function returns STRSAFE_E_INSUFFICIENT_BUFFER, pszDest
- will not contain a truncated string, it will remain unchanged.
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag
- is specified. If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc
- may be NULL. An error may still be returned even though NULLS are ignored
- due to insufficient space.
-
-Return Value:
-
- S_OK - if all of pszSrc or the first cchMaxAppend characters
- were concatenated to pszDest and the resultant dest
- string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the operation
- failed due to insufficient space. When this error
- occurs, the destination buffer is modified to contain
- a truncated version of the ideal result and is null
- terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCchCatNExA(char* pszDest, size_t cchDest, const char* pszSrc, size_t cchMaxAppend, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCchCatNExW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, size_t cchMaxAppend, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-#ifdef UNICODE
-#define StringCchCatNEx StringCchCatNExW
-#else
-#define StringCchCatNEx StringCchCatNExA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCchCatNExA(char* pszDest, size_t cchDest, const char* pszSrc, size_t cchMaxAppend, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
-
- // safe to multiply cchDest * sizeof(char) since cchDest < STRSAFE_MAX_CCH and sizeof(char) is 1
- cbDest = cchDest * sizeof(char);
-
- hr = StringCatNExWorkerA(pszDest, cchDest, cbDest, pszSrc, cchMaxAppend, ppszDestEnd, pcchRemaining, dwFlags);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCchCatNExW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, size_t cchMaxAppend, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
-
- // safe to multiply cchDest * sizeof(wchar_t) since cchDest < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- cbDest = cchDest * sizeof(wchar_t);
-
- hr = StringCatNExWorkerW(pszDest, cchDest, cbDest, pszSrc, cchMaxAppend, ppszDestEnd, pcchRemaining, dwFlags);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbCatNEx(
- IN OUT LPTSTR pszDest OPTIONAL,
- IN size_t cbDest,
- IN LPCTSTR pszSrc OPTIONAL,
- IN size_t cbMaxAppend,
- OUT LPTSTR* ppszDestEnd OPTIONAL,
- OUT size_t* pcchRemaining OPTIONAL,
- IN DWORD dwFlags
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strncat', with
- some additional parameters. In addition to functionality provided by
- StringCbCatN, this routine also returns a pointer to the end of the
- destination string and the number of bytes left in the destination string
- including the null terminator. The flags parameter allows additional controls.
-
-Arguments:
-
- pszDest - destination string which must be null terminated
-
- cbDest - size of destination buffer in bytes.
- length must be ((_tcslen(pszDest) + min(cbMaxAppend / sizeof(TCHAR), _tcslen(pszSrc)) + 1) * sizeof(TCHAR)
- to hold all of the combine string plus the null
- terminator.
-
- pszSrc - source string
-
- cbMaxAppend - maximum number of bytes to append
-
- ppszDestEnd - if ppszDestEnd is non-null, the function will return a
- pointer to the end of the destination string. If the
- function appended any data, the result will point to the
- null termination character
-
- pcbRemaining - if pcbRemaining is non-null, the function will return the
- number of bytes left in the destination string,
- including the null terminator
-
- dwFlags - controls some details of the string copy:
-
- STRSAFE_FILL_BEHIND_NULL
- if the function succeeds, the low byte of dwFlags will be
- used to fill the uninitialize part of destination buffer
- behind the null terminator
-
- STRSAFE_IGNORE_NULLS
- treat NULL string pointers like empty strings (TEXT(""))
-
- STRSAFE_FILL_ON_FAILURE
- if the function fails, the low byte of dwFlags will be
- used to fill all of the destination buffer, and it will
- be null terminated. This will overwrite any pre-existing
- or truncated string
-
- STRSAFE_NULL_ON_FAILURE
- if the function fails, the destination buffer will be set
- to the empty string. This will overwrite any pre-existing or
- truncated string
-
- STRSAFE_NO_TRUNCATION
- if the function returns STRSAFE_E_INSUFFICIENT_BUFFER, pszDest
- will not contain a truncated string, it will remain unchanged.
-
-Notes:
- Behavior is undefined if source and destination strings overlap.
-
- pszDest and pszSrc should not be NULL unless the STRSAFE_IGNORE_NULLS flag
- is specified. If STRSAFE_IGNORE_NULLS is passed, both pszDest and pszSrc
- may be NULL. An error may still be returned even though NULLS are ignored
- due to insufficient space.
-
-Return Value:
-
- S_OK - if all of pszSrc or the first cbMaxAppend bytes were
- concatenated to pszDest and the resultant dest string
- was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the operation
- failed due to insufficient space. When this error
- occurs, the destination buffer is modified to contain
- a truncated version of the ideal result and is null
- terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCbCatNExA(char* pszDest, size_t cbDest, const char* pszSrc, size_t cbMaxAppend, char** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags);
-STRSAFEAPI StringCbCatNExW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc, size_t cbMaxAppend, wchar_t** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags);
-#ifdef UNICODE
-#define StringCbCatNEx StringCbCatNExW
-#else
-#define StringCbCatNEx StringCbCatNExA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCbCatNExA(char* pszDest, size_t cbDest, const char* pszSrc, size_t cbMaxAppend, char** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchRemaining = 0;
-
- cchDest = cbDest / sizeof(char);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cchMaxAppend;
-
- cchMaxAppend = cbMaxAppend / sizeof(char);
-
- hr = StringCatNExWorkerA(pszDest, cchDest, cbDest, pszSrc, cchMaxAppend, ppszDestEnd, &cchRemaining, dwFlags);
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (pcbRemaining)
- {
- // safe to multiply cchRemaining * sizeof(char) since cchRemaining < STRSAFE_MAX_CCH and sizeof(char) is 1
- *pcbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCbCatNExW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszSrc, size_t cbMaxAppend, wchar_t** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchRemaining = 0;
-
- cchDest = cbDest / sizeof(wchar_t);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cchMaxAppend;
-
- cchMaxAppend = cbMaxAppend / sizeof(wchar_t);
-
- hr = StringCatNExWorkerW(pszDest, cchDest, cbDest, pszSrc, cchMaxAppend, ppszDestEnd, &cchRemaining, dwFlags);
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (pcbRemaining)
- {
- // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- *pcbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
- }
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchVPrintf(
- OUT LPTSTR pszDest,
- IN size_t cchDest,
- IN LPCTSTR pszFormat,
- IN va_list argList
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'vsprintf'.
- The size of the destination buffer (in characters) is a parameter and
- this function will not write past the end of this buffer and it will
- ALWAYS null terminate the destination buffer (unless it is zero length).
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if the string was printed without truncation and null terminated,
- otherwise it will return a failure code. In failure cases it will return
- a truncated version of the ideal result.
-
-Arguments:
-
- pszDest - destination string
-
- cchDest - size of destination buffer in characters
- length must be sufficient to hold the resulting formatted
- string, including the null terminator.
-
- pszFormat - format string which must be null terminated
-
- argList - va_list from the variable arguments according to the
- stdarg.h convention
-
-Notes:
- Behavior is undefined if destination, format strings or any arguments
- strings overlap.
-
- pszDest and pszFormat should not be NULL. See StringCchVPrintfEx if you
- require the handling of NULL values.
-
-Return Value:
-
- S_OK - if there was sufficient space in the dest buffer for
- the resultant string and it was null terminated.
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the print
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCchVPrintfA(char* pszDest, size_t cchDest, const char* pszFormat, va_list argList);
-STRSAFEAPI StringCchVPrintfW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszFormat, va_list argList);
-#ifdef UNICODE
-#define StringCchVPrintf StringCchVPrintfW
-#else
-#define StringCchVPrintf StringCchVPrintfA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCchVPrintfA(char* pszDest, size_t cchDest, const char* pszFormat, va_list argList)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringVPrintfWorkerA(pszDest, cchDest, pszFormat, argList);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCchVPrintfW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszFormat, va_list argList)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringVPrintfWorkerW(pszDest, cchDest, pszFormat, argList);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbVPrintf(
- OUT LPTSTR pszDest,
- IN size_t cbDest,
- IN LPCTSTR pszFormat,
- IN va_list argList
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'vsprintf'.
- The size of the destination buffer (in bytes) is a parameter and
- this function will not write past the end of this buffer and it will
- ALWAYS null terminate the destination buffer (unless it is zero length).
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if the string was printed without truncation and null terminated,
- otherwise it will return a failure code. In failure cases it will return
- a truncated version of the ideal result.
-
-Arguments:
-
- pszDest - destination string
-
- cbDest - size of destination buffer in bytes
- length must be sufficient to hold the resulting formatted
- string, including the null terminator.
-
- pszFormat - format string which must be null terminated
-
- argList - va_list from the variable arguments according to the
- stdarg.h convention
-
-Notes:
- Behavior is undefined if destination, format strings or any arguments
- strings overlap.
-
- pszDest and pszFormat should not be NULL. See StringCbVPrintfEx if you
- require the handling of NULL values.
-
-
-Return Value:
-
- S_OK - if there was sufficient space in the dest buffer for
- the resultant string and it was null terminated.
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the print
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCbVPrintfA(char* pszDest, size_t cbDest, const char* pszFormat, va_list argList);
-STRSAFEAPI StringCbVPrintfW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszFormat, va_list argList);
-#ifdef UNICODE
-#define StringCbVPrintf StringCbVPrintfW
-#else
-#define StringCbVPrintf StringCbVPrintfA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCbVPrintfA(char* pszDest, size_t cbDest, const char* pszFormat, va_list argList)
-{
- HRESULT hr;
- size_t cchDest;
-
- cchDest = cbDest / sizeof(char);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringVPrintfWorkerA(pszDest, cchDest, pszFormat, argList);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCbVPrintfW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszFormat, va_list argList)
-{
- HRESULT hr;
- size_t cchDest;
-
- cchDest = cbDest / sizeof(wchar_t);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringVPrintfWorkerW(pszDest, cchDest, pszFormat, argList);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchPrintf(
- OUT LPTSTR pszDest,
- IN size_t cchDest,
- IN LPCTSTR pszFormat,
- ...
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'sprintf'.
- The size of the destination buffer (in characters) is a parameter and
- this function will not write past the end of this buffer and it will
- ALWAYS null terminate the destination buffer (unless it is zero length).
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if the string was printed without truncation and null terminated,
- otherwise it will return a failure code. In failure cases it will return
- a truncated version of the ideal result.
-
-Arguments:
-
- pszDest - destination string
-
- cchDest - size of destination buffer in characters
- length must be sufficient to hold the resulting formatted
- string, including the null terminator.
-
- pszFormat - format string which must be null terminated
-
- ... - additional parameters to be formatted according to
- the format string
-
-Notes:
- Behavior is undefined if destination, format strings or any arguments
- strings overlap.
-
- pszDest and pszFormat should not be NULL. See StringCchPrintfEx if you
- require the handling of NULL values.
-
-Return Value:
-
- S_OK - if there was sufficient space in the dest buffer for
- the resultant string and it was null terminated.
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the print
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCchPrintfA(char* pszDest, size_t cchDest, const char* pszFormat, ...);
-STRSAFEAPI StringCchPrintfW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszFormat, ...);
-#ifdef UNICODE
-#define StringCchPrintf StringCchPrintfW
-#else
-#define StringCchPrintf StringCchPrintfA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCchPrintfA(char* pszDest, size_t cchDest, const char* pszFormat, ...)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- va_list argList;
-
- va_start(argList, pszFormat);
-
- hr = StringVPrintfWorkerA(pszDest, cchDest, pszFormat, argList);
-
- va_end(argList);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCchPrintfW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszFormat, ...)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- va_list argList;
-
- va_start(argList, pszFormat);
-
- hr = StringVPrintfWorkerW(pszDest, cchDest, pszFormat, argList);
-
- va_end(argList);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbPrintf(
- OUT LPTSTR pszDest,
- IN size_t cbDest,
- IN LPCTSTR pszFormat,
- ...
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'sprintf'.
- The size of the destination buffer (in bytes) is a parameter and
- this function will not write past the end of this buffer and it will
- ALWAYS null terminate the destination buffer (unless it is zero length).
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if the string was printed without truncation and null terminated,
- otherwise it will return a failure code. In failure cases it will return
- a truncated version of the ideal result.
-
-Arguments:
-
- pszDest - destination string
-
- cbDest - size of destination buffer in bytes
- length must be sufficient to hold the resulting formatted
- string, including the null terminator.
-
- pszFormat - format string which must be null terminated
-
- ... - additional parameters to be formatted according to
- the format string
-
-Notes:
- Behavior is undefined if destination, format strings or any arguments
- strings overlap.
-
- pszDest and pszFormat should not be NULL. See StringCbPrintfEx if you
- require the handling of NULL values.
-
-
-Return Value:
-
- S_OK - if there was sufficient space in the dest buffer for
- the resultant string and it was null terminated.
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the print
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCbPrintfA(char* pszDest, size_t cbDest, const char* pszFormat, ...);
-STRSAFEAPI StringCbPrintfW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszFormat, ...);
-#ifdef UNICODE
-#define StringCbPrintf StringCbPrintfW
-#else
-#define StringCbPrintf StringCbPrintfA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCbPrintfA(char* pszDest, size_t cbDest, const char* pszFormat, ...)
-{
- HRESULT hr;
- size_t cchDest;
-
- cchDest = cbDest / sizeof(char);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- va_list argList;
-
- va_start(argList, pszFormat);
-
- hr = StringVPrintfWorkerA(pszDest, cchDest, pszFormat, argList);
-
- va_end(argList);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCbPrintfW(wchar_t* pszDest, size_t cbDest, const wchar_t* pszFormat, ...)
-{
- HRESULT hr;
- size_t cchDest;
-
- cchDest = cbDest / sizeof(wchar_t);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- va_list argList;
-
- va_start(argList, pszFormat);
-
- hr = StringVPrintfWorkerW(pszDest, cchDest, pszFormat, argList);
-
- va_end(argList);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchPrintfEx(
- OUT LPTSTR pszDest OPTIONAL,
- IN size_t cchDest,
- OUT LPTSTR* ppszDestEnd OPTIONAL,
- OUT size_t* pcchRemaining OPTIONAL,
- IN DWORD dwFlags,
- IN LPCTSTR pszFormat OPTIONAL,
- ...
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'sprintf' with
- some additional parameters. In addition to functionality provided by
- StringCchPrintf, this routine also returns a pointer to the end of the
- destination string and the number of characters left in the destination string
- including the null terminator. The flags parameter allows additional controls.
-
-Arguments:
-
- pszDest - destination string
-
- cchDest - size of destination buffer in characters.
- length must be sufficient to contain the resulting
- formatted string plus the null terminator.
-
- ppszDestEnd - if ppszDestEnd is non-null, the function will return a
- pointer to the end of the destination string. If the
- function printed any data, the result will point to the
- null termination character
-
- pcchRemaining - if pcchRemaining is non-null, the function will return
- the number of characters left in the destination string,
- including the null terminator
-
- dwFlags - controls some details of the string copy:
-
- STRSAFE_FILL_BEHIND_NULL
- if the function succeeds, the low byte of dwFlags will be
- used to fill the uninitialize part of destination buffer
- behind the null terminator
-
- STRSAFE_IGNORE_NULLS
- treat NULL string pointers like empty strings (TEXT(""))
-
- STRSAFE_FILL_ON_FAILURE
- if the function fails, the low byte of dwFlags will be
- used to fill all of the destination buffer, and it will
- be null terminated. This will overwrite any truncated
- string returned when the failure is
- STRSAFE_E_INSUFFICIENT_BUFFER
-
- STRSAFE_NO_TRUNCATION /
- STRSAFE_NULL_ON_FAILURE
- if the function fails, the destination buffer will be set
- to the empty string. This will overwrite any truncated string
- returned when the failure is STRSAFE_E_INSUFFICIENT_BUFFER.
-
- pszFormat - format string which must be null terminated
-
- ... - additional parameters to be formatted according to
- the format string
-
-Notes:
- Behavior is undefined if destination, format strings or any arguments
- strings overlap.
-
- pszDest and pszFormat should not be NULL unless the STRSAFE_IGNORE_NULLS
- flag is specified. If STRSAFE_IGNORE_NULLS is passed, both pszDest and
- pszFormat may be NULL. An error may still be returned even though NULLS
- are ignored due to insufficient space.
-
-Return Value:
-
- S_OK - if there was source data and it was all concatenated and
- the resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the print
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCchPrintfExA(char* pszDest, size_t cchDest, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags, const char* pszFormat, ...);
-STRSAFEAPI StringCchPrintfExW(wchar_t* pszDest, size_t cchDest, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags, const wchar_t* pszFormat, ...);
-#ifdef UNICODE
-#define StringCchPrintfEx StringCchPrintfExW
-#else
-#define StringCchPrintfEx StringCchPrintfExA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCchPrintfExA(char* pszDest, size_t cchDest, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags, const char* pszFormat, ...)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
- va_list argList;
-
- // safe to multiply cchDest * sizeof(char) since cchDest < STRSAFE_MAX_CCH and sizeof(char) is 1
- cbDest = cchDest * sizeof(char);
- va_start(argList, pszFormat);
-
- hr = StringVPrintfExWorkerA(pszDest, cchDest, cbDest, ppszDestEnd, pcchRemaining, dwFlags, pszFormat, argList);
-
- va_end(argList);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCchPrintfExW(wchar_t* pszDest, size_t cchDest, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags, const wchar_t* pszFormat, ...)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
- va_list argList;
-
- // safe to multiply cchDest * sizeof(wchar_t) since cchDest < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- cbDest = cchDest * sizeof(wchar_t);
- va_start(argList, pszFormat);
-
- hr = StringVPrintfExWorkerW(pszDest, cchDest, cbDest, ppszDestEnd, pcchRemaining, dwFlags, pszFormat, argList);
-
- va_end(argList);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbPrintfEx(
- OUT LPTSTR pszDest OPTIONAL,
- IN size_t cbDest,
- OUT LPTSTR* ppszDestEnd OPTIONAL,
- OUT size_t* pcbRemaining OPTIONAL,
- IN DWORD dwFlags,
- IN LPCTSTR pszFormat OPTIONAL,
- ...
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'sprintf' with
- some additional parameters. In addition to functionality provided by
- StringCbPrintf, this routine also returns a pointer to the end of the
- destination string and the number of bytes left in the destination string
- including the null terminator. The flags parameter allows additional controls.
-
-Arguments:
-
- pszDest - destination string
-
- cbDest - size of destination buffer in bytes.
- length must be sufficient to contain the resulting
- formatted string plus the null terminator.
-
- ppszDestEnd - if ppszDestEnd is non-null, the function will return a
- pointer to the end of the destination string. If the
- function printed any data, the result will point to the
- null termination character
-
- pcbRemaining - if pcbRemaining is non-null, the function will return
- the number of bytes left in the destination string,
- including the null terminator
-
- dwFlags - controls some details of the string copy:
-
- STRSAFE_FILL_BEHIND_NULL
- if the function succeeds, the low byte of dwFlags will be
- used to fill the uninitialize part of destination buffer
- behind the null terminator
-
- STRSAFE_IGNORE_NULLS
- treat NULL string pointers like empty strings (TEXT(""))
-
- STRSAFE_FILL_ON_FAILURE
- if the function fails, the low byte of dwFlags will be
- used to fill all of the destination buffer, and it will
- be null terminated. This will overwrite any truncated
- string returned when the failure is
- STRSAFE_E_INSUFFICIENT_BUFFER
-
- STRSAFE_NO_TRUNCATION /
- STRSAFE_NULL_ON_FAILURE
- if the function fails, the destination buffer will be set
- to the empty string. This will overwrite any truncated string
- returned when the failure is STRSAFE_E_INSUFFICIENT_BUFFER.
-
- pszFormat - format string which must be null terminated
-
- ... - additional parameters to be formatted according to
- the format string
-
-Notes:
- Behavior is undefined if destination, format strings or any arguments
- strings overlap.
-
- pszDest and pszFormat should not be NULL unless the STRSAFE_IGNORE_NULLS
- flag is specified. If STRSAFE_IGNORE_NULLS is passed, both pszDest and
- pszFormat may be NULL. An error may still be returned even though NULLS
- are ignored due to insufficient space.
-
-Return Value:
-
- S_OK - if there was source data and it was all concatenated and
- the resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the print
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCbPrintfExA(char* pszDest, size_t cbDest, char** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags, const char* pszFormat, ...);
-STRSAFEAPI StringCbPrintfExW(wchar_t* pszDest, size_t cbDest, wchar_t** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags, const wchar_t* pszFormat, ...);
-#ifdef UNICODE
-#define StringCbPrintfEx StringCbPrintfExW
-#else
-#define StringCbPrintfEx StringCbPrintfExA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCbPrintfExA(char* pszDest, size_t cbDest, char** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags, const char* pszFormat, ...)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchRemaining = 0;
-
- cchDest = cbDest / sizeof(char);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- va_list argList;
-
- va_start(argList, pszFormat);
-
- hr = StringVPrintfExWorkerA(pszDest, cchDest, cbDest, ppszDestEnd, &cchRemaining, dwFlags, pszFormat, argList);
-
- va_end(argList);
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (pcbRemaining)
- {
- // safe to multiply cchRemaining * sizeof(char) since cchRemaining < STRSAFE_MAX_CCH and sizeof(char) is 1
- *pcbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCbPrintfExW(wchar_t* pszDest, size_t cbDest, wchar_t** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags, const wchar_t* pszFormat, ...)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchRemaining = 0;
-
- cchDest = cbDest / sizeof(wchar_t);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- va_list argList;
-
- va_start(argList, pszFormat);
-
- hr = StringVPrintfExWorkerW(pszDest, cchDest, cbDest, ppszDestEnd, &cchRemaining, dwFlags, pszFormat, argList);
-
- va_end(argList);
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (pcbRemaining)
- {
- // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- *pcbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
- }
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchVPrintfEx(
- OUT LPTSTR pszDest OPTIONAL,
- IN size_t cchDest,
- OUT LPTSTR* ppszDestEnd OPTIONAL,
- OUT size_t* pcchRemaining OPTIONAL,
- IN DWORD dwFlags,
- IN LPCTSTR pszFormat OPTIONAL,
- IN va_list argList
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'vsprintf' with
- some additional parameters. In addition to functionality provided by
- StringCchVPrintf, this routine also returns a pointer to the end of the
- destination string and the number of characters left in the destination string
- including the null terminator. The flags parameter allows additional controls.
-
-Arguments:
-
- pszDest - destination string
-
- cchDest - size of destination buffer in characters.
- length must be sufficient to contain the resulting
- formatted string plus the null terminator.
-
- ppszDestEnd - if ppszDestEnd is non-null, the function will return a
- pointer to the end of the destination string. If the
- function printed any data, the result will point to the
- null termination character
-
- pcchRemaining - if pcchRemaining is non-null, the function will return
- the number of characters left in the destination string,
- including the null terminator
-
- dwFlags - controls some details of the string copy:
-
- STRSAFE_FILL_BEHIND_NULL
- if the function succeeds, the low byte of dwFlags will be
- used to fill the uninitialize part of destination buffer
- behind the null terminator
-
- STRSAFE_IGNORE_NULLS
- treat NULL string pointers like empty strings (TEXT(""))
-
- STRSAFE_FILL_ON_FAILURE
- if the function fails, the low byte of dwFlags will be
- used to fill all of the destination buffer, and it will
- be null terminated. This will overwrite any truncated
- string returned when the failure is
- STRSAFE_E_INSUFFICIENT_BUFFER
-
- STRSAFE_NO_TRUNCATION /
- STRSAFE_NULL_ON_FAILURE
- if the function fails, the destination buffer will be set
- to the empty string. This will overwrite any truncated string
- returned when the failure is STRSAFE_E_INSUFFICIENT_BUFFER.
-
- pszFormat - format string which must be null terminated
-
- argList - va_list from the variable arguments according to the
- stdarg.h convention
-
-Notes:
- Behavior is undefined if destination, format strings or any arguments
- strings overlap.
-
- pszDest and pszFormat should not be NULL unless the STRSAFE_IGNORE_NULLS
- flag is specified. If STRSAFE_IGNORE_NULLS is passed, both pszDest and
- pszFormat may be NULL. An error may still be returned even though NULLS
- are ignored due to insufficient space.
-
-Return Value:
-
- S_OK - if there was source data and it was all concatenated and
- the resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the print
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCchVPrintfExA(char* pszDest, size_t cchDest, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags, const char* pszFormat, va_list argList);
-STRSAFEAPI StringCchVPrintfExW(wchar_t* pszDest, size_t cchDest, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags, const wchar_t* pszFormat, va_list argList);
-#ifdef UNICODE
-#define StringCchVPrintfEx StringCchVPrintfExW
-#else
-#define StringCchVPrintfEx StringCchVPrintfExA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCchVPrintfExA(char* pszDest, size_t cchDest, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags, const char* pszFormat, va_list argList)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
-
- // safe to multiply cchDest * sizeof(char) since cchDest < STRSAFE_MAX_CCH and sizeof(char) is 1
- cbDest = cchDest * sizeof(char);
-
- hr = StringVPrintfExWorkerA(pszDest, cchDest, cbDest, ppszDestEnd, pcchRemaining, dwFlags, pszFormat, argList);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCchVPrintfExW(wchar_t* pszDest, size_t cchDest, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags, const wchar_t* pszFormat, va_list argList)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
-
- // safe to multiply cchDest * sizeof(wchar_t) since cchDest < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- cbDest = cchDest * sizeof(wchar_t);
-
- hr = StringVPrintfExWorkerW(pszDest, cchDest, cbDest, ppszDestEnd, pcchRemaining, dwFlags, pszFormat, argList);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbVPrintfEx(
- OUT LPTSTR pszDest OPTIONAL,
- IN size_t cbDest,
- OUT LPTSTR* ppszDestEnd OPTIONAL,
- OUT size_t* pcbRemaining OPTIONAL,
- IN DWORD dwFlags,
- IN LPCTSTR pszFormat OPTIONAL,
- IN va_list argList
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'vsprintf' with
- some additional parameters. In addition to functionality provided by
- StringCbVPrintf, this routine also returns a pointer to the end of the
- destination string and the number of characters left in the destination string
- including the null terminator. The flags parameter allows additional controls.
-
-Arguments:
-
- pszDest - destination string
-
- cbDest - size of destination buffer in bytes.
- length must be sufficient to contain the resulting
- formatted string plus the null terminator.
-
- ppszDestEnd - if ppszDestEnd is non-null, the function will return
- a pointer to the end of the destination string. If the
- function printed any data, the result will point to the
- null termination character
-
- pcbRemaining - if pcbRemaining is non-null, the function will return
- the number of bytes left in the destination string,
- including the null terminator
-
- dwFlags - controls some details of the string copy:
-
- STRSAFE_FILL_BEHIND_NULL
- if the function succeeds, the low byte of dwFlags will be
- used to fill the uninitialize part of destination buffer
- behind the null terminator
-
- STRSAFE_IGNORE_NULLS
- treat NULL string pointers like empty strings (TEXT(""))
-
- STRSAFE_FILL_ON_FAILURE
- if the function fails, the low byte of dwFlags will be
- used to fill all of the destination buffer, and it will
- be null terminated. This will overwrite any truncated
- string returned when the failure is
- STRSAFE_E_INSUFFICIENT_BUFFER
-
- STRSAFE_NO_TRUNCATION /
- STRSAFE_NULL_ON_FAILURE
- if the function fails, the destination buffer will be set
- to the empty string. This will overwrite any truncated string
- returned when the failure is STRSAFE_E_INSUFFICIENT_BUFFER.
-
- pszFormat - format string which must be null terminated
-
- argList - va_list from the variable arguments according to the
- stdarg.h convention
-
-Notes:
- Behavior is undefined if destination, format strings or any arguments
- strings overlap.
-
- pszDest and pszFormat should not be NULL unless the STRSAFE_IGNORE_NULLS
- flag is specified. If STRSAFE_IGNORE_NULLS is passed, both pszDest and
- pszFormat may be NULL. An error may still be returned even though NULLS
- are ignored due to insufficient space.
-
-Return Value:
-
- S_OK - if there was source data and it was all concatenated and
- the resultant dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that the print
- operation failed due to insufficient space. When this
- error occurs, the destination buffer is modified to
- contain a truncated version of the ideal result and is
- null terminated. This is useful for situations where
- truncation is ok.
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function
-
---*/
-
-STRSAFEAPI StringCbVPrintfExA(char* pszDest, size_t cbDest, char** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags, const char* pszFormat, va_list argList);
-STRSAFEAPI StringCbVPrintfExW(wchar_t* pszDest, size_t cbDest, wchar_t** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags, const wchar_t* pszFormat, va_list argList);
-#ifdef UNICODE
-#define StringCbVPrintfEx StringCbVPrintfExW
-#else
-#define StringCbVPrintfEx StringCbVPrintfExA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCbVPrintfExA(char* pszDest, size_t cbDest, char** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags, const char* pszFormat, va_list argList)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchRemaining = 0;
-
- cchDest = cbDest / sizeof(char);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringVPrintfExWorkerA(pszDest, cchDest, cbDest, ppszDestEnd, &cchRemaining, dwFlags, pszFormat, argList);
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (pcbRemaining)
- {
- // safe to multiply cchRemaining * sizeof(char) since cchRemaining < STRSAFE_MAX_CCH and sizeof(char) is 1
- *pcbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCbVPrintfExW(wchar_t* pszDest, size_t cbDest, wchar_t** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags, const wchar_t* pszFormat, va_list argList)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchRemaining = 0;
-
- cchDest = cbDest / sizeof(wchar_t);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringVPrintfExWorkerW(pszDest, cchDest, cbDest, ppszDestEnd, &cchRemaining, dwFlags, pszFormat, argList);
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (pcbRemaining)
- {
- // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- *pcbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
- }
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchGets(
- OUT LPTSTR pszDest,
- IN size_t cchDest
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'gets'.
- The size of the destination buffer (in characters) is a parameter and
- this function will not write past the end of this buffer and it will
- ALWAYS null terminate the destination buffer (unless it is zero length).
-
- This routine is not a replacement for fgets. That function does not replace
- newline characters with a null terminator.
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if any characters were read from stdin and copied to pszDest and
- pszDest was null terminated, otherwise it will return a failure code.
-
-Arguments:
-
- pszDest - destination string
-
- cchDest - size of destination buffer in characters.
-
-Notes:
- pszDest should not be NULL. See StringCchGetsEx if you require the handling
- of NULL values.
-
- cchDest must be > 1 for this function to succeed.
-
-Return Value:
-
- S_OK - data was read from stdin and copied, and the resultant
- dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_END_OF_FILE /
- HRESULT_CODE(hr) == ERROR_HANDLE_EOF
- - this return value indicates an error or end-of-file
- condition, use feof or ferror to determine which one has
- occured.
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that there was
- insufficient space in the destination buffer to copy any
- data
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function.
-
---*/
-
-#ifndef STRSAFE_LIB_IMPL
-STRSAFE_INLINE_API StringCchGetsA(char* pszDest, size_t cchDest);
-STRSAFE_INLINE_API StringCchGetsW(wchar_t* pszDest, size_t cchDest);
-#ifdef UNICODE
-#define StringCchGets StringCchGetsW
-#else
-#define StringCchGets StringCchGetsA
-#endif // !UNICODE
-
-STRSAFE_INLINE_API StringCchGetsA(char* pszDest, size_t cchDest)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
-
- // safe to multiply cchDest * sizeof(char) since cchDest < STRSAFE_MAX_CCH and sizeof(char) is 1
- cbDest = cchDest * sizeof(char);
-
- hr = StringGetsExWorkerA(pszDest, cchDest, cbDest, NULL, NULL, 0);
- }
-
- return hr;
-}
-
-STRSAFE_INLINE_API StringCchGetsW(wchar_t* pszDest, size_t cchDest)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
-
- // safe to multiply cchDest * sizeof(wchar_t) since cchDest < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- cbDest = cchDest * sizeof(wchar_t);
-
- hr = StringGetsExWorkerW(pszDest, cchDest, cbDest, NULL, NULL, 0);
- }
-
- return hr;
-}
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-#endif // !STRSAFE_LIB_IMPL
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbGets(
- OUT LPTSTR pszDest,
- IN size_t cbDest
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'gets'.
- The size of the destination buffer (in bytes) is a parameter and
- this function will not write past the end of this buffer and it will
- ALWAYS null terminate the destination buffer (unless it is zero length).
-
- This routine is not a replacement for fgets. That function does not replace
- newline characters with a null terminator.
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if any characters were read from stdin and copied to pszDest
- and pszDest was null terminated, otherwise it will return a failure code.
-
-Arguments:
-
- pszDest - destination string
-
- cbDest - size of destination buffer in bytes.
-
-Notes:
- pszDest should not be NULL. See StringCbGetsEx if you require the handling
- of NULL values.
-
- cbDest must be > sizeof(TCHAR) for this function to succeed.
-
-Return Value:
-
- S_OK - data was read from stdin and copied, and the resultant
- dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_END_OF_FILE /
- HRESULT_CODE(hr) == ERROR_HANDLE_EOF
- - this return value indicates an error or end-of-file
- condition, use feof or ferror to determine which one has
- occured.
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that there was
- insufficient space in the destination buffer to copy any
- data
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function.
-
---*/
-
-#ifndef STRSAFE_LIB_IMPL
-STRSAFE_INLINE_API StringCbGetsA(char* pszDest, size_t cbDest);
-STRSAFE_INLINE_API StringCbGetsW(wchar_t* pszDest, size_t cbDest);
-#ifdef UNICODE
-#define StringCbGets StringCbGetsW
-#else
-#define StringCbGets StringCbGetsA
-#endif // !UNICODE
-
-STRSAFE_INLINE_API StringCbGetsA(char* pszDest, size_t cbDest)
-{
- HRESULT hr;
- size_t cchDest;
-
- // convert to count of characters
- cchDest = cbDest / sizeof(char);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringGetsExWorkerA(pszDest, cchDest, cbDest, NULL, NULL, 0);
- }
-
- return hr;
-}
-
-STRSAFE_INLINE_API StringCbGetsW(wchar_t* pszDest, size_t cbDest)
-{
- HRESULT hr;
- size_t cchDest;
-
- // convert to count of characters
- cchDest = cbDest / sizeof(wchar_t);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringGetsExWorkerW(pszDest, cchDest, cbDest, NULL, NULL, 0);
- }
-
- return hr;
-}
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-#endif // !STRSAFE_LIB_IMPL
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchGetsEx(
- OUT LPTSTR pszDest OPTIONAL,
- IN size_t cchDest,
- OUT LPTSTR* ppszDestEnd OPTIONAL,
- OUT size_t* pcchRemaining OPTIONAL,
- IN DWORD dwFlags
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'gets' with
- some additional parameters. In addition to functionality provided by
- StringCchGets, this routine also returns a pointer to the end of the
- destination string and the number of characters left in the destination string
- including the null terminator. The flags parameter allows additional controls.
-
-Arguments:
-
- pszDest - destination string
-
- cchDest - size of destination buffer in characters.
-
- ppszDestEnd - if ppszDestEnd is non-null, the function will return a
- pointer to the end of the destination string. If the
- function copied any data, the result will point to the
- null termination character
-
- pcchRemaining - if pcchRemaining is non-null, the function will return the
- number of characters left in the destination string,
- including the null terminator
-
- dwFlags - controls some details of the string copy:
-
- STRSAFE_FILL_BEHIND_NULL
- if the function succeeds, the low byte of dwFlags will be
- used to fill the uninitialize part of destination buffer
- behind the null terminator
-
- STRSAFE_IGNORE_NULLS
- treat NULL string pointers like empty strings (TEXT("")).
-
- STRSAFE_FILL_ON_FAILURE
- if the function fails, the low byte of dwFlags will be
- used to fill all of the destination buffer, and it will
- be null terminated.
-
- STRSAFE_NO_TRUNCATION /
- STRSAFE_NULL_ON_FAILURE
- if the function fails, the destination buffer will be set
- to the empty string.
-
-Notes:
- pszDest should not be NULL unless the STRSAFE_IGNORE_NULLS flag is specified.
- If STRSAFE_IGNORE_NULLS is passed and pszDest is NULL, an error may still be
- returned even though NULLS are ignored
-
- cchDest must be > 1 for this function to succeed.
-
-Return Value:
-
- S_OK - data was read from stdin and copied, and the resultant
- dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_END_OF_FILE /
- HRESULT_CODE(hr) == ERROR_HANDLE_EOF
- - this return value indicates an error or end-of-file
- condition, use feof or ferror to determine which one has
- occured.
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that there was
- insufficient space in the destination buffer to copy any
- data
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function.
-
---*/
-
-#ifndef STRSAFE_LIB_IMPL
-STRSAFE_INLINE_API StringCchGetsExA(char* pszDest, size_t cchDest, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-STRSAFE_INLINE_API StringCchGetsExW(wchar_t* pszDest, size_t cchDest, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags);
-#ifdef UNICODE
-#define StringCchGetsEx StringCchGetsExW
-#else
-#define StringCchGetsEx StringCchGetsExA
-#endif // !UNICODE
-
-STRSAFE_INLINE_API StringCchGetsExA(char* pszDest, size_t cchDest, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
-
- // safe to multiply cchDest * sizeof(char) since cchDest < STRSAFE_MAX_CCH and sizeof(char) is 1
- cbDest = cchDest * sizeof(char);
-
- hr = StringGetsExWorkerA(pszDest, cchDest, cbDest, ppszDestEnd, pcchRemaining, dwFlags);
- }
-
- return hr;
-}
-
-STRSAFE_INLINE_API StringCchGetsExW(wchar_t* pszDest, size_t cchDest, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cbDest;
-
- // safe to multiply cchDest * sizeof(wchar_t) since cchDest < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- cbDest = cchDest * sizeof(wchar_t);
-
- hr = StringGetsExWorkerW(pszDest, cchDest, cbDest, ppszDestEnd, pcchRemaining, dwFlags);
- }
-
- return hr;
-}
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-#endif // !STRSAFE_LIB_IMPL
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbGetsEx(
- OUT LPTSTR pszDest OPTIONAL,
- IN size_t cbDest,
- OUT LPTSTR* ppszDestEnd OPTIONAL,
- OUT size_t* pcbRemaining OPTIONAL,
- IN DWORD dwFlags
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'gets' with
- some additional parameters. In addition to functionality provided by
- StringCbGets, this routine also returns a pointer to the end of the
- destination string and the number of characters left in the destination string
- including the null terminator. The flags parameter allows additional controls.
-
-Arguments:
-
- pszDest - destination string
-
- cbDest - size of destination buffer in bytes.
-
- ppszDestEnd - if ppszDestEnd is non-null, the function will return a
- pointer to the end of the destination string. If the
- function copied any data, the result will point to the
- null termination character
-
- pcbRemaining - if pbRemaining is non-null, the function will return the
- number of bytes left in the destination string,
- including the null terminator
-
- dwFlags - controls some details of the string copy:
-
- STRSAFE_FILL_BEHIND_NULL
- if the function succeeds, the low byte of dwFlags will be
- used to fill the uninitialize part of destination buffer
- behind the null terminator
-
- STRSAFE_IGNORE_NULLS
- treat NULL string pointers like empty strings (TEXT("")).
-
- STRSAFE_FILL_ON_FAILURE
- if the function fails, the low byte of dwFlags will be
- used to fill all of the destination buffer, and it will
- be null terminated.
-
- STRSAFE_NO_TRUNCATION /
- STRSAFE_NULL_ON_FAILURE
- if the function fails, the destination buffer will be set
- to the empty string.
-
-Notes:
- pszDest should not be NULL unless the STRSAFE_IGNORE_NULLS flag is specified.
- If STRSAFE_IGNORE_NULLS is passed and pszDest is NULL, an error may still be
- returned even though NULLS are ignored
-
- cbDest must be > sizeof(TCHAR) for this function to succeed
-
-Return Value:
-
- S_OK - data was read from stdin and copied, and the resultant
- dest string was null terminated
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- STRSAFE_E_END_OF_FILE /
- HRESULT_CODE(hr) == ERROR_HANDLE_EOF
- - this return value indicates an error or end-of-file
- condition, use feof or ferror to determine which one has
- occured.
-
- STRSAFE_E_INSUFFICIENT_BUFFER /
- HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER
- - this return value is an indication that there was
- insufficient space in the destination buffer to copy any
- data
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function.
-
---*/
-
-#ifndef STRSAFE_LIB_IMPL
-STRSAFE_INLINE_API StringCbGetsExA(char* pszDest, size_t cbDest, char** ppszDestEnd, size_t* pbRemaining, unsigned long dwFlags);
-STRSAFE_INLINE_API StringCbGetsExW(wchar_t* pszDest, size_t cbDest, wchar_t** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags);
-#ifdef UNICODE
-#define StringCbGetsEx StringCbGetsExW
-#else
-#define StringCbGetsEx StringCbGetsExA
-#endif // !UNICODE
-
-STRSAFE_INLINE_API StringCbGetsExA(char* pszDest, size_t cbDest, char** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchRemaining = 0;
-
- cchDest = cbDest / sizeof(char);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringGetsExWorkerA(pszDest, cchDest, cbDest, ppszDestEnd, &cchRemaining, dwFlags);
- }
-
- if (SUCCEEDED(hr) ||
- (hr == STRSAFE_E_INSUFFICIENT_BUFFER) ||
- (hr == STRSAFE_E_END_OF_FILE))
- {
- if (pcbRemaining)
- {
- // safe to multiply cchRemaining * sizeof(char) since cchRemaining < STRSAFE_MAX_CCH and sizeof(char) is 1
- *pcbRemaining = (cchRemaining * sizeof(char)) + (cbDest % sizeof(char));
- }
- }
-
- return hr;
-}
-
-STRSAFE_INLINE_API StringCbGetsExW(wchar_t* pszDest, size_t cbDest, wchar_t** ppszDestEnd, size_t* pcbRemaining, unsigned long dwFlags)
-{
- HRESULT hr;
- size_t cchDest;
- size_t cchRemaining = 0;
-
- cchDest = cbDest / sizeof(wchar_t);
-
- if (cchDest > STRSAFE_MAX_CCH)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringGetsExWorkerW(pszDest, cchDest, cbDest, ppszDestEnd, &cchRemaining, dwFlags);
- }
-
- if (SUCCEEDED(hr) ||
- (hr == STRSAFE_E_INSUFFICIENT_BUFFER) ||
- (hr == STRSAFE_E_END_OF_FILE))
- {
- if (pcbRemaining)
- {
- // safe to multiply cchRemaining * sizeof(wchar_t) since cchRemaining < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- *pcbRemaining = (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
- }
- }
-
- return hr;
-}
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-#endif // !STRSAFE_LIB_IMPL
-
-#ifndef STRSAFE_NO_CCH_FUNCTIONS
-/*++
-
-STDAPI
-StringCchLength(
- IN LPCTSTR psz,
- IN size_t cchMax,
- OUT size_t* pcch OPTIONAL
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strlen'.
- It is used to make sure a string is not larger than a given length, and
- it optionally returns the current length in characters not including
- the null terminator.
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if the string is non-null and the length including the null
- terminator is less than or equal to cchMax characters.
-
-Arguments:
-
- psz - string to check the length of
-
- cchMax - maximum number of characters including the null terminator
- that psz is allowed to contain
-
- pcch - if the function succeeds and pcch is non-null, the current length
- in characters of psz excluding the null terminator will be returned.
- This out parameter is equivalent to the return value of strlen(psz)
-
-Notes:
- psz can be null but the function will fail
-
- cchMax should be greater than zero or the function will fail
-
-Return Value:
-
- S_OK - psz is non-null and the length including the null
- terminator is less than or equal to cchMax characters
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function.
-
---*/
-
-STRSAFEAPI StringCchLengthA(const char* psz, size_t cchMax, size_t* pcch);
-STRSAFEAPI StringCchLengthW(const wchar_t* psz, size_t cchMax, size_t* pcch);
-#ifdef UNICODE
-#define StringCchLength StringCchLengthW
-#else
-#define StringCchLength StringCchLengthA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCchLengthA(const char* psz, size_t cchMax, size_t* pcch)
-{
- HRESULT hr;
-
- if ((psz == NULL) || (cchMax > STRSAFE_MAX_CCH))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringLengthWorkerA(psz, cchMax, pcch);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCchLengthW(const wchar_t* psz, size_t cchMax, size_t* pcch)
-{
- HRESULT hr;
-
- if ((psz == NULL) || (cchMax > STRSAFE_MAX_CCH))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringLengthWorkerW(psz, cchMax, pcch);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CCH_FUNCTIONS
-
-
-#ifndef STRSAFE_NO_CB_FUNCTIONS
-/*++
-
-STDAPI
-StringCbLength(
- IN LPCTSTR psz,
- IN size_t cbMax,
- OUT size_t* pcb OPTIONAL
- );
-
-Routine Description:
-
- This routine is a safer version of the C built-in function 'strlen'.
- It is used to make sure a string is not larger than a given length, and
- it optionally returns the current length in bytes not including
- the null terminator.
-
- This function returns a hresult, and not a pointer. It returns
- S_OK if the string is non-null and the length including the null
- terminator is less than or equal to cbMax bytes.
-
-Arguments:
-
- psz - string to check the length of
-
- cbMax - maximum number of bytes including the null terminator
- that psz is allowed to contain
-
- pcb - if the function succeeds and pcb is non-null, the current length
- in bytes of psz excluding the null terminator will be returned.
- This out parameter is equivalent to the return value of strlen(psz) * sizeof(TCHAR)
-
-Notes:
- psz can be null but the function will fail
-
- cbMax should be greater than or equal to sizeof(TCHAR) or the function will fail
-
-Return Value:
-
- S_OK - psz is non-null and the length including the null
- terminator is less than or equal to cbMax bytes
-
- failure - you can use the macro HRESULT_CODE() to get a win32
- error code for all hresult failure cases
-
- It is strongly recommended to use the SUCCEEDED() / FAILED() macros to test the
- return value of this function.
-
---*/
-
-STRSAFEAPI StringCbLengthA(const char* psz, size_t cchMax, size_t* pcch);
-STRSAFEAPI StringCbLengthW(const wchar_t* psz, size_t cchMax, size_t* pcch);
-#ifdef UNICODE
-#define StringCbLength StringCbLengthW
-#else
-#define StringCbLength StringCbLengthA
-#endif // !UNICODE
-
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCbLengthA(const char* psz, size_t cbMax, size_t* pcb)
-{
- HRESULT hr;
- size_t cchMax;
- size_t cch = 0;
-
- cchMax = cbMax / sizeof(char);
-
- if ((psz == NULL) || (cchMax > STRSAFE_MAX_CCH))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringLengthWorkerA(psz, cchMax, &cch);
- }
-
- if (SUCCEEDED(hr) && pcb)
- {
- // safe to multiply cch * sizeof(char) since cch < STRSAFE_MAX_CCH and sizeof(char) is 1
- *pcb = cch * sizeof(char);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCbLengthW(const wchar_t* psz, size_t cbMax, size_t* pcb)
-{
- HRESULT hr;
- size_t cchMax;
- size_t cch = 0;
-
- cchMax = cbMax / sizeof(wchar_t);
-
- if ((psz == NULL) || (cchMax > STRSAFE_MAX_CCH))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = StringLengthWorkerW(psz, cchMax, &cch);
- }
-
- if (SUCCEEDED(hr) && pcb)
- {
- // safe to multiply cch * sizeof(wchar_t) since cch < STRSAFE_MAX_CCH and sizeof(wchar_t) is 2
- *pcb = cch * sizeof(wchar_t);
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-#endif // !STRSAFE_NO_CB_FUNCTIONS
-
-
-// these are the worker functions that actually do the work
-#ifdef STRSAFE_INLINE
-STRSAFEAPI StringCopyWorkerA(char* pszDest, size_t cchDest, const char* pszSrc)
-{
- HRESULT hr = S_OK;
-
- if (cchDest == 0)
- {
- // can not null terminate a zero-byte dest buffer
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- while (cchDest && (*pszSrc != '\0'))
- {
- *pszDest++ = *pszSrc++;
- cchDest--;
- }
-
- if (cchDest == 0)
- {
- // we are going to truncate pszDest
- pszDest--;
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
-
- *pszDest= '\0';
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCopyWorkerW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc)
-{
- HRESULT hr = S_OK;
-
- if (cchDest == 0)
- {
- // can not null terminate a zero-byte dest buffer
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- while (cchDest && (*pszSrc != L'\0'))
- {
- *pszDest++ = *pszSrc++;
- cchDest--;
- }
-
- if (cchDest == 0)
- {
- // we are going to truncate pszDest
- pszDest--;
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
-
- *pszDest= L'\0';
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCopyExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, const char* pszSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr = S_OK;
- char* pszDestEnd = pszDest;
- size_t cchRemaining = 0;
-
- // ASSERT(cbDest == (cchDest * sizeof(char)) ||
- // cbDest == (cchDest * sizeof(char)) + (cbDest % sizeof(char)));
-
- // only accept valid flags
- if (dwFlags & (~STRSAFE_VALID_FLAGS))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- if (dwFlags & STRSAFE_IGNORE_NULLS)
- {
- if (pszDest == NULL)
- {
- if ((cchDest != 0) || (cbDest != 0))
- {
- // NULL pszDest and non-zero cchDest/cbDest is invalid
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- }
-
- if (pszSrc == NULL)
- {
- pszSrc = "";
- }
- }
-
- if (SUCCEEDED(hr))
- {
- if (cchDest == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = 0;
-
- // only fail if there was actually src data to copy
- if (*pszSrc != '\0')
- {
- if (pszDest == NULL)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- }
- }
- else
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- while (cchRemaining && (*pszSrc != '\0'))
- {
- *pszDestEnd++= *pszSrc++;
- cchRemaining--;
- }
-
- if (cchRemaining > 0)
- {
- if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
- {
- memset(pszDestEnd + 1, STRSAFE_GET_FILL_PATTERN(dwFlags), ((cchRemaining - 1) * sizeof(char)) + (cbDest % sizeof(char)));
- }
- }
- else
- {
- // we are going to truncate pszDest
- pszDestEnd--;
- cchRemaining++;
-
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
-
- *pszDestEnd = '\0';
- }
- }
- }
-
- if (FAILED(hr))
- {
- if (pszDest)
- {
- if (dwFlags & STRSAFE_FILL_ON_FAILURE)
- {
- memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);
-
- if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
- }
- else if (cchDest > 0)
- {
- pszDestEnd = pszDest + cchDest - 1;
- cchRemaining = 1;
-
- // null terminate the end of the string
- *pszDestEnd = '\0';
- }
- }
-
- if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
- {
- if (cchDest > 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- // null terminate the beginning of the string
- *pszDestEnd = '\0';
- }
- }
- }
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (ppszDestEnd)
- {
- *ppszDestEnd = pszDestEnd;
- }
-
- if (pcchRemaining)
- {
- *pcchRemaining = cchRemaining;
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCopyExWorkerW(wchar_t* pszDest, size_t cchDest, size_t cbDest, const wchar_t* pszSrc, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr = S_OK;
- wchar_t* pszDestEnd = pszDest;
- size_t cchRemaining = 0;
-
- // ASSERT(cbDest == (cchDest * sizeof(wchar_t)) ||
- // cbDest == (cchDest * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
-
- // only accept valid flags
- if (dwFlags & (~STRSAFE_VALID_FLAGS))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- if (dwFlags & STRSAFE_IGNORE_NULLS)
- {
- if (pszDest == NULL)
- {
- if ((cchDest != 0) || (cbDest != 0))
- {
- // NULL pszDest and non-zero cchDest/cbDest is invalid
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- }
-
- if (pszSrc == NULL)
- {
- pszSrc = L"";
- }
- }
-
- if (SUCCEEDED(hr))
- {
- if (cchDest == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = 0;
-
- // only fail if there was actually src data to copy
- if (*pszSrc != L'\0')
- {
- if (pszDest == NULL)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- }
- }
- else
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- while (cchRemaining && (*pszSrc != L'\0'))
- {
- *pszDestEnd++= *pszSrc++;
- cchRemaining--;
- }
-
- if (cchRemaining > 0)
- {
- if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
- {
- memset(pszDestEnd + 1, STRSAFE_GET_FILL_PATTERN(dwFlags), ((cchRemaining - 1) * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
- }
- }
- else
- {
- // we are going to truncate pszDest
- pszDestEnd--;
- cchRemaining++;
-
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
-
- *pszDestEnd = L'\0';
- }
- }
- }
-
- if (FAILED(hr))
- {
- if (pszDest)
- {
- if (dwFlags & STRSAFE_FILL_ON_FAILURE)
- {
- memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);
-
- if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
- }
- else if (cchDest > 0)
- {
- pszDestEnd = pszDest + cchDest - 1;
- cchRemaining = 1;
-
- // null terminate the end of the string
- *pszDestEnd = L'\0';
- }
- }
-
- if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
- {
- if (cchDest > 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- // null terminate the beginning of the string
- *pszDestEnd = L'\0';
- }
- }
- }
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (ppszDestEnd)
- {
- *ppszDestEnd = pszDestEnd;
- }
-
- if (pcchRemaining)
- {
- *pcchRemaining = cchRemaining;
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCopyNWorkerA(char* pszDest, size_t cchDest, const char* pszSrc, size_t cchSrc)
-{
- HRESULT hr = S_OK;
-
- if (cchDest == 0)
- {
- // can not null terminate a zero-byte dest buffer
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- while (cchDest && cchSrc && (*pszSrc != '\0'))
- {
- *pszDest++= *pszSrc++;
- cchDest--;
- cchSrc--;
- }
-
- if (cchDest == 0)
- {
- // we are going to truncate pszDest
- pszDest--;
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
-
- *pszDest= '\0';
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCopyNWorkerW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, size_t cchSrc)
-{
- HRESULT hr = S_OK;
-
- if (cchDest == 0)
- {
- // can not null terminate a zero-byte dest buffer
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- while (cchDest && cchSrc && (*pszSrc != L'\0'))
- {
- *pszDest++= *pszSrc++;
- cchDest--;
- cchSrc--;
- }
-
- if (cchDest == 0)
- {
- // we are going to truncate pszDest
- pszDest--;
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
-
- *pszDest= L'\0';
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCopyNExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, const char* pszSrc, size_t cchSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr = S_OK;
- char* pszDestEnd = pszDest;
- size_t cchRemaining = 0;
-
- // ASSERT(cbDest == (cchDest * sizeof(char)) ||
- // cbDest == (cchDest * sizeof(char)) + (cbDest % sizeof(char)));
-
- // only accept valid flags
- if (dwFlags & (~STRSAFE_VALID_FLAGS))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- if (dwFlags & STRSAFE_IGNORE_NULLS)
- {
- if (pszDest == NULL)
- {
- if ((cchDest != 0) || (cbDest != 0))
- {
- // NULL pszDest and non-zero cchDest/cbDest is invalid
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- }
-
- if (pszSrc == NULL)
- {
- pszSrc = "";
- }
- }
-
- if (SUCCEEDED(hr))
- {
- if (cchDest == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = 0;
-
- // only fail if there was actually src data to copy
- if (*pszSrc != '\0')
- {
- if (pszDest == NULL)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- }
- }
- else
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- while (cchRemaining && cchSrc && (*pszSrc != '\0'))
- {
- *pszDestEnd++= *pszSrc++;
- cchRemaining--;
- cchSrc--;
- }
-
- if (cchRemaining > 0)
- {
- if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
- {
- memset(pszDestEnd + 1, STRSAFE_GET_FILL_PATTERN(dwFlags), ((cchRemaining - 1) * sizeof(char)) + (cbDest % sizeof(char)));
- }
- }
- else
- {
- // we are going to truncate pszDest
- pszDestEnd--;
- cchRemaining++;
-
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
-
- *pszDestEnd = '\0';
- }
- }
- }
-
- if (FAILED(hr))
- {
- if (pszDest)
- {
- if (dwFlags & STRSAFE_FILL_ON_FAILURE)
- {
- memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);
-
- if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
- }
- else if (cchDest > 0)
- {
- pszDestEnd = pszDest + cchDest - 1;
- cchRemaining = 1;
-
- // null terminate the end of the string
- *pszDestEnd = '\0';
- }
- }
-
- if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
- {
- if (cchDest > 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- // null terminate the beginning of the string
- *pszDestEnd = '\0';
- }
- }
- }
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (ppszDestEnd)
- {
- *ppszDestEnd = pszDestEnd;
- }
-
- if (pcchRemaining)
- {
- *pcchRemaining = cchRemaining;
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCopyNExWorkerW(wchar_t* pszDest, size_t cchDest, size_t cbDest, const wchar_t* pszSrc, size_t cchSrc, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr = S_OK;
- wchar_t* pszDestEnd = pszDest;
- size_t cchRemaining = 0;
-
- // ASSERT(cbDest == (cchDest * sizeof(wchar_t)) ||
- // cbDest == (cchDest * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
-
- // only accept valid flags
- if (dwFlags & (~STRSAFE_VALID_FLAGS))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- if (dwFlags & STRSAFE_IGNORE_NULLS)
- {
- if (pszDest == NULL)
- {
- if ((cchDest != 0) || (cbDest != 0))
- {
- // NULL pszDest and non-zero cchDest/cbDest is invalid
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- }
-
- if (pszSrc == NULL)
- {
- pszSrc = L"";
- }
- }
-
- if (SUCCEEDED(hr))
- {
- if (cchDest == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = 0;
-
- // only fail if there was actually src data to copy
- if (*pszSrc != L'\0')
- {
- if (pszDest == NULL)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- }
- }
- else
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- while (cchRemaining && cchSrc && (*pszSrc != L'\0'))
- {
- *pszDestEnd++= *pszSrc++;
- cchRemaining--;
- cchSrc--;
- }
-
- if (cchRemaining > 0)
- {
- if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
- {
- memset(pszDestEnd + 1, STRSAFE_GET_FILL_PATTERN(dwFlags), ((cchRemaining - 1) * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
- }
- }
- else
- {
- // we are going to truncate pszDest
- pszDestEnd--;
- cchRemaining++;
-
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
-
- *pszDestEnd = L'\0';
- }
- }
- }
-
- if (FAILED(hr))
- {
- if (pszDest)
- {
- if (dwFlags & STRSAFE_FILL_ON_FAILURE)
- {
- memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);
-
- if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
- }
- else if (cchDest > 0)
- {
- pszDestEnd = pszDest + cchDest - 1;
- cchRemaining = 1;
-
- // null terminate the end of the string
- *pszDestEnd = L'\0';
- }
- }
-
- if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
- {
- if (cchDest > 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- // null terminate the beginning of the string
- *pszDestEnd = L'\0';
- }
- }
- }
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (ppszDestEnd)
- {
- *ppszDestEnd = pszDestEnd;
- }
-
- if (pcchRemaining)
- {
- *pcchRemaining = cchRemaining;
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCatWorkerA(char* pszDest, size_t cchDest, const char* pszSrc)
-{
- HRESULT hr;
- size_t cchDestCurrent;
-
- hr = StringLengthWorkerA(pszDest, cchDest, &cchDestCurrent);
-
- if (SUCCEEDED(hr))
- {
- hr = StringCopyWorkerA(pszDest + cchDestCurrent,
- cchDest - cchDestCurrent,
- pszSrc);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCatWorkerW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc)
-{
- HRESULT hr;
- size_t cchDestCurrent;
-
- hr = StringLengthWorkerW(pszDest, cchDest, &cchDestCurrent);
-
- if (SUCCEEDED(hr))
- {
- hr = StringCopyWorkerW(pszDest + cchDestCurrent,
- cchDest - cchDestCurrent,
- pszSrc);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCatExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, const char* pszSrc, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr = S_OK;
- char* pszDestEnd = pszDest;
- size_t cchRemaining = 0;
-
- // ASSERT(cbDest == (cchDest * sizeof(char)) ||
- // cbDest == (cchDest * sizeof(char)) + (cbDest % sizeof(char)));
-
- // only accept valid flags
- if (dwFlags & (~STRSAFE_VALID_FLAGS))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cchDestCurrent;
-
- if (dwFlags & STRSAFE_IGNORE_NULLS)
- {
- if (pszDest == NULL)
- {
- if ((cchDest == 0) && (cbDest == 0))
- {
- cchDestCurrent = 0;
- }
- else
- {
- // NULL pszDest and non-zero cchDest/cbDest is invalid
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- }
- else
- {
- hr = StringLengthWorkerA(pszDest, cchDest, &cchDestCurrent);
-
- if (SUCCEEDED(hr))
- {
- pszDestEnd = pszDest + cchDestCurrent;
- cchRemaining = cchDest - cchDestCurrent;
- }
- }
-
- if (pszSrc == NULL)
- {
- pszSrc = "";
- }
- }
- else
- {
- hr = StringLengthWorkerA(pszDest, cchDest, &cchDestCurrent);
-
- if (SUCCEEDED(hr))
- {
- pszDestEnd = pszDest + cchDestCurrent;
- cchRemaining = cchDest - cchDestCurrent;
- }
- }
-
- if (SUCCEEDED(hr))
- {
- if (cchDest == 0)
- {
- // only fail if there was actually src data to append
- if (*pszSrc != '\0')
- {
- if (pszDest == NULL)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- }
- }
- else
- {
- // we handle the STRSAFE_FILL_ON_FAILURE and STRSAFE_NULL_ON_FAILURE cases below, so do not pass
- // those flags through
- hr = StringCopyExWorkerA(pszDestEnd,
- cchRemaining,
- (cchRemaining * sizeof(char)) + (cbDest % sizeof(char)),
- pszSrc,
- &pszDestEnd,
- &cchRemaining,
- dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)));
- }
- }
- }
-
- if (FAILED(hr))
- {
- if (pszDest)
- {
- // STRSAFE_NO_TRUNCATION is taken care of by StringCopyExWorkerA()
-
- if (dwFlags & STRSAFE_FILL_ON_FAILURE)
- {
- memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);
-
- if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
- }
- else
- if (cchDest > 0)
- {
- pszDestEnd = pszDest + cchDest - 1;
- cchRemaining = 1;
-
- // null terminate the end of the string
- *pszDestEnd = '\0';
- }
- }
-
- if (dwFlags & STRSAFE_NULL_ON_FAILURE)
- {
- if (cchDest > 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- // null terminate the beginning of the string
- *pszDestEnd = '\0';
- }
- }
- }
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (ppszDestEnd)
- {
- *ppszDestEnd = pszDestEnd;
- }
-
- if (pcchRemaining)
- {
- *pcchRemaining = cchRemaining;
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCatExWorkerW(wchar_t* pszDest, size_t cchDest, size_t cbDest, const wchar_t* pszSrc, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr = S_OK;
- wchar_t* pszDestEnd = pszDest;
- size_t cchRemaining = 0;
-
- // ASSERT(cbDest == (cchDest * sizeof(wchar_t)) ||
- // cbDest == (cchDest * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
-
- // only accept valid flags
- if (dwFlags & (~STRSAFE_VALID_FLAGS))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- size_t cchDestCurrent;
-
- if (dwFlags & STRSAFE_IGNORE_NULLS)
- {
- if (pszDest == NULL)
- {
- if ((cchDest == 0) && (cbDest == 0))
- {
- cchDestCurrent = 0;
- }
- else
- {
- // NULL pszDest and non-zero cchDest/cbDest is invalid
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- }
- else
- {
- hr = StringLengthWorkerW(pszDest, cchDest, &cchDestCurrent);
-
- if (SUCCEEDED(hr))
- {
- pszDestEnd = pszDest + cchDestCurrent;
- cchRemaining = cchDest - cchDestCurrent;
- }
- }
-
- if (pszSrc == NULL)
- {
- pszSrc = L"";
- }
- }
- else
- {
- hr = StringLengthWorkerW(pszDest, cchDest, &cchDestCurrent);
-
- if (SUCCEEDED(hr))
- {
- pszDestEnd = pszDest + cchDestCurrent;
- cchRemaining = cchDest - cchDestCurrent;
- }
- }
-
- if (SUCCEEDED(hr))
- {
- if (cchDest == 0)
- {
- // only fail if there was actually src data to append
- if (*pszSrc != L'\0')
- {
- if (pszDest == NULL)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- }
- }
- else
- {
- // we handle the STRSAFE_FILL_ON_FAILURE and STRSAFE_NULL_ON_FAILURE cases below, so do not pass
- // those flags through
- hr = StringCopyExWorkerW(pszDestEnd,
- cchRemaining,
- (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)),
- pszSrc,
- &pszDestEnd,
- &cchRemaining,
- dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)));
- }
- }
- }
-
- if (FAILED(hr))
- {
- if (pszDest)
- {
- // STRSAFE_NO_TRUNCATION is taken care of by StringCopyExWorkerW()
-
- if (dwFlags & STRSAFE_FILL_ON_FAILURE)
- {
- memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);
-
- if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
- }
- else if (cchDest > 0)
- {
- pszDestEnd = pszDest + cchDest - 1;
- cchRemaining = 1;
-
- // null terminate the end of the string
- *pszDestEnd = L'\0';
- }
- }
-
- if (dwFlags & STRSAFE_NULL_ON_FAILURE)
- {
- if (cchDest > 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- // null terminate the beginning of the string
- *pszDestEnd = L'\0';
- }
- }
- }
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (ppszDestEnd)
- {
- *ppszDestEnd = pszDestEnd;
- }
-
- if (pcchRemaining)
- {
- *pcchRemaining = cchRemaining;
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCatNWorkerA(char* pszDest, size_t cchDest, const char* pszSrc, size_t cchMaxAppend)
-{
- HRESULT hr;
- size_t cchDestCurrent;
-
- hr = StringLengthWorkerA(pszDest, cchDest, &cchDestCurrent);
-
- if (SUCCEEDED(hr))
- {
- hr = StringCopyNWorkerA(pszDest + cchDestCurrent,
- cchDest - cchDestCurrent,
- pszSrc,
- cchMaxAppend);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCatNWorkerW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszSrc, size_t cchMaxAppend)
-{
- HRESULT hr;
- size_t cchDestCurrent;
-
- hr = StringLengthWorkerW(pszDest, cchDest, &cchDestCurrent);
-
- if (SUCCEEDED(hr))
- {
- hr = StringCopyNWorkerW(pszDest + cchDestCurrent,
- cchDest - cchDestCurrent,
- pszSrc,
- cchMaxAppend);
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCatNExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, const char* pszSrc, size_t cchMaxAppend, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr = S_OK;
- char* pszDestEnd = pszDest;
- size_t cchRemaining = 0;
- size_t cchDestCurrent = 0;
-
- // ASSERT(cbDest == (cchDest * sizeof(char)) ||
- // cbDest == (cchDest * sizeof(char)) + (cbDest % sizeof(char)));
-
- // only accept valid flags
- if (dwFlags & (~STRSAFE_VALID_FLAGS))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- if (dwFlags & STRSAFE_IGNORE_NULLS)
- {
- if (pszDest == NULL)
- {
- if ((cchDest == 0) && (cbDest == 0))
- {
- cchDestCurrent = 0;
- }
- else
- {
- // NULL pszDest and non-zero cchDest/cbDest is invalid
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- }
- else
- {
- hr = StringLengthWorkerA(pszDest, cchDest, &cchDestCurrent);
-
- if (SUCCEEDED(hr))
- {
- pszDestEnd = pszDest + cchDestCurrent;
- cchRemaining = cchDest - cchDestCurrent;
- }
- }
-
- if (pszSrc == NULL)
- {
- pszSrc = "";
- }
- }
- else
- {
- hr = StringLengthWorkerA(pszDest, cchDest, &cchDestCurrent);
-
- if (SUCCEEDED(hr))
- {
- pszDestEnd = pszDest + cchDestCurrent;
- cchRemaining = cchDest - cchDestCurrent;
- }
- }
-
- if (SUCCEEDED(hr))
- {
- if (cchDest == 0)
- {
- // only fail if there was actually src data to append
- if (*pszSrc != '\0')
- {
- if (pszDest == NULL)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- }
- }
- else
- {
- // we handle the STRSAFE_FILL_ON_FAILURE and STRSAFE_NULL_ON_FAILURE cases below, so do not pass
- // those flags through
- hr = StringCopyNExWorkerA(pszDestEnd,
- cchRemaining,
- (cchRemaining * sizeof(char)) + (cbDest % sizeof(char)),
- pszSrc,
- cchMaxAppend,
- &pszDestEnd,
- &cchRemaining,
- dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)));
- }
- }
- }
-
- if (FAILED(hr))
- {
- if (pszDest)
- {
- // STRSAFE_NO_TRUNCATION is taken care of by StringCopyNExWorkerA()
-
- if (dwFlags & STRSAFE_FILL_ON_FAILURE)
- {
- memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);
-
- if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
- }
- else if (cchDest > 0)
- {
- pszDestEnd = pszDest + cchDest - 1;
- cchRemaining = 1;
-
- // null terminate the end of the string
- *pszDestEnd = '\0';
- }
- }
-
- if (dwFlags & (STRSAFE_NULL_ON_FAILURE))
- {
- if (cchDest > 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- // null terminate the beginning of the string
- *pszDestEnd = '\0';
- }
- }
- }
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (ppszDestEnd)
- {
- *ppszDestEnd = pszDestEnd;
- }
-
- if (pcchRemaining)
- {
- *pcchRemaining = cchRemaining;
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringCatNExWorkerW(wchar_t* pszDest, size_t cchDest, size_t cbDest, const wchar_t* pszSrc, size_t cchMaxAppend, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr = S_OK;
- wchar_t* pszDestEnd = pszDest;
- size_t cchRemaining = 0;
- size_t cchDestCurrent = 0;
-
-
- // ASSERT(cbDest == (cchDest * sizeof(wchar_t)) ||
- // cbDest == (cchDest * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
-
- // only accept valid flags
- if (dwFlags & (~STRSAFE_VALID_FLAGS))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- if (dwFlags & STRSAFE_IGNORE_NULLS)
- {
- if (pszDest == NULL)
- {
- if ((cchDest == 0) && (cbDest == 0))
- {
- cchDestCurrent = 0;
- }
- else
- {
- // NULL pszDest and non-zero cchDest/cbDest is invalid
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- }
- else
- {
- hr = StringLengthWorkerW(pszDest, cchDest, &cchDestCurrent);
-
- if (SUCCEEDED(hr))
- {
- pszDestEnd = pszDest + cchDestCurrent;
- cchRemaining = cchDest - cchDestCurrent;
- }
- }
-
- if (pszSrc == NULL)
- {
- pszSrc = L"";
- }
- }
- else
- {
- hr = StringLengthWorkerW(pszDest, cchDest, &cchDestCurrent);
-
- if (SUCCEEDED(hr))
- {
- pszDestEnd = pszDest + cchDestCurrent;
- cchRemaining = cchDest - cchDestCurrent;
- }
- }
-
- if (SUCCEEDED(hr))
- {
- if (cchDest == 0)
- {
- // only fail if there was actually src data to append
- if (*pszSrc != L'\0')
- {
- if (pszDest == NULL)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- }
- }
- else
- {
- // we handle the STRSAFE_FILL_ON_FAILURE and STRSAFE_NULL_ON_FAILURE cases below, so do not pass
- // those flags through
- hr = StringCopyNExWorkerW(pszDestEnd,
- cchRemaining,
- (cchRemaining * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)),
- pszSrc,
- cchMaxAppend,
- &pszDestEnd,
- &cchRemaining,
- dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)));
- }
- }
- }
-
- if (FAILED(hr))
- {
- if (pszDest)
- {
- // STRSAFE_NO_TRUNCATION is taken care of by StringCopyNExWorkerW()
-
- if (dwFlags & STRSAFE_FILL_ON_FAILURE)
- {
- memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);
-
- if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
- }
- else if (cchDest > 0)
- {
- pszDestEnd = pszDest + cchDest - 1;
- cchRemaining = 1;
-
- // null terminate the end of the string
- *pszDestEnd = L'\0';
- }
- }
-
- if (dwFlags & (STRSAFE_NULL_ON_FAILURE))
- {
- if (cchDest > 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- // null terminate the beginning of the string
- *pszDestEnd = L'\0';
- }
- }
- }
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (ppszDestEnd)
- {
- *ppszDestEnd = pszDestEnd;
- }
-
- if (pcchRemaining)
- {
- *pcchRemaining = cchRemaining;
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringVPrintfWorkerA(char* pszDest, size_t cchDest, const char* pszFormat, va_list argList)
-{
- HRESULT hr = S_OK;
-
- if (cchDest == 0)
- {
- // can not null terminate a zero-byte dest buffer
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- int iRet;
- size_t cchMax;
-
- // leave the last space for the null terminator
- cchMax = cchDest - 1;
-
- iRet = _vsnprintf(pszDest, cchMax, pszFormat, argList);
- // ASSERT((iRet < 0) || (((size_t)iRet) <= cchMax));
-
- if ((iRet < 0) || (((size_t)iRet) > cchMax))
- {
- // need to null terminate the string
- pszDest += cchMax;
- *pszDest = '\0';
-
- // we have truncated pszDest
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- else if (((size_t)iRet) == cchMax)
- {
- // need to null terminate the string
- pszDest += cchMax;
- *pszDest = '\0';
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringVPrintfWorkerW(wchar_t* pszDest, size_t cchDest, const wchar_t* pszFormat, va_list argList)
-{
- HRESULT hr = S_OK;
-
- if (cchDest == 0)
- {
- // can not null terminate a zero-byte dest buffer
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- int iRet;
- size_t cchMax;
-
- // leave the last space for the null terminator
- cchMax = cchDest - 1;
-
- iRet = _vsnwprintf(pszDest, cchMax, pszFormat, argList);
- // ASSERT((iRet < 0) || (((size_t)iRet) <= cchMax));
-
- if ((iRet < 0) || (((size_t)iRet) > cchMax))
- {
- // need to null terminate the string
- pszDest += cchMax;
- *pszDest = L'\0';
-
- // we have truncated pszDest
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- else if (((size_t)iRet) == cchMax)
- {
- // need to null terminate the string
- pszDest += cchMax;
- *pszDest = L'\0';
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringVPrintfExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags, const char* pszFormat, va_list argList)
-{
- HRESULT hr = S_OK;
- char* pszDestEnd = pszDest;
- size_t cchRemaining = 0;
-
- // ASSERT(cbDest == (cchDest * sizeof(char)) ||
- // cbDest == (cchDest * sizeof(char)) + (cbDest % sizeof(char)));
-
- // only accept valid flags
- if (dwFlags & (~STRSAFE_VALID_FLAGS))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- if (dwFlags & STRSAFE_IGNORE_NULLS)
- {
- if (pszDest == NULL)
- {
- if ((cchDest != 0) || (cbDest != 0))
- {
- // NULL pszDest and non-zero cchDest/cbDest is invalid
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- }
-
- if (pszFormat == NULL)
- {
- pszFormat = "";
- }
- }
-
- if (SUCCEEDED(hr))
- {
- if (cchDest == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = 0;
-
- // only fail if there was actually a non-empty format string
- if (*pszFormat != '\0')
- {
- if (pszDest == NULL)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- }
- }
- else
- {
- int iRet;
- size_t cchMax;
-
- // leave the last space for the null terminator
- cchMax = cchDest - 1;
-
- iRet = _vsnprintf(pszDest, cchMax, pszFormat, argList);
- // ASSERT((iRet < 0) || (((size_t)iRet) <= cchMax));
-
- if ((iRet < 0) || (((size_t)iRet) > cchMax))
- {
- // we have truncated pszDest
- pszDestEnd = pszDest + cchMax;
- cchRemaining = 1;
-
- // need to null terminate the string
- *pszDestEnd = '\0';
-
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- else if (((size_t)iRet) == cchMax)
- {
- // string fit perfectly
- pszDestEnd = pszDest + cchMax;
- cchRemaining = 1;
-
- // need to null terminate the string
- *pszDestEnd = '\0';
- }
- else if (((size_t)iRet) < cchMax)
- {
- // there is extra room
- pszDestEnd = pszDest + iRet;
- cchRemaining = cchDest - iRet;
-
- if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
- {
- memset(pszDestEnd + 1, STRSAFE_GET_FILL_PATTERN(dwFlags), ((cchRemaining - 1) * sizeof(char)) + (cbDest % sizeof(char)));
- }
- }
- }
- }
- }
-
- if (FAILED(hr))
- {
- if (pszDest)
- {
- if (dwFlags & STRSAFE_FILL_ON_FAILURE)
- {
- memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);
-
- if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
- }
- else if (cchDest > 0)
- {
- pszDestEnd = pszDest + cchDest - 1;
- cchRemaining = 1;
-
- // null terminate the end of the string
- *pszDestEnd = '\0';
- }
- }
-
- if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
- {
- if (cchDest > 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- // null terminate the beginning of the string
- *pszDestEnd = '\0';
- }
- }
- }
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (ppszDestEnd)
- {
- *ppszDestEnd = pszDestEnd;
- }
-
- if (pcchRemaining)
- {
- *pcchRemaining = cchRemaining;
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringVPrintfExWorkerW(wchar_t* pszDest, size_t cchDest, size_t cbDest, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags, const wchar_t* pszFormat, va_list argList)
-{
- HRESULT hr = S_OK;
- wchar_t* pszDestEnd = pszDest;
- size_t cchRemaining = 0;
-
- // ASSERT(cbDest == (cchDest * sizeof(wchar_t)) ||
- // cbDest == (cchDest * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
-
- // only accept valid flags
- if (dwFlags & (~STRSAFE_VALID_FLAGS))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- if (dwFlags & STRSAFE_IGNORE_NULLS)
- {
- if (pszDest == NULL)
- {
- if ((cchDest != 0) || (cbDest != 0))
- {
- // NULL pszDest and non-zero cchDest/cbDest is invalid
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- }
-
- if (pszFormat == NULL)
- {
- pszFormat = L"";
- }
- }
-
- if (SUCCEEDED(hr))
- {
- if (cchDest == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = 0;
-
- // only fail if there was actually a non-empty format string
- if (*pszFormat != L'\0')
- {
- if (pszDest == NULL)
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- }
- }
- else
- {
- int iRet;
- size_t cchMax;
-
- // leave the last space for the null terminator
- cchMax = cchDest - 1;
-
- iRet = _vsnwprintf(pszDest, cchMax, pszFormat, argList);
- // ASSERT((iRet < 0) || (((size_t)iRet) <= cchMax));
-
- if ((iRet < 0) || (((size_t)iRet) > cchMax))
- {
- // we have truncated pszDest
- pszDestEnd = pszDest + cchMax;
- cchRemaining = 1;
-
- // need to null terminate the string
- *pszDestEnd = L'\0';
-
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- else if (((size_t)iRet) == cchMax)
- {
- // string fit perfectly
- pszDestEnd = pszDest + cchMax;
- cchRemaining = 1;
-
- // need to null terminate the string
- *pszDestEnd = L'\0';
- }
- else if (((size_t)iRet) < cchMax)
- {
- // there is extra room
- pszDestEnd = pszDest + iRet;
- cchRemaining = cchDest - iRet;
-
- if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
- {
- memset(pszDestEnd + 1, STRSAFE_GET_FILL_PATTERN(dwFlags), ((cchRemaining - 1) * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
- }
- }
- }
- }
- }
-
- if (FAILED(hr))
- {
- if (pszDest)
- {
- if (dwFlags & STRSAFE_FILL_ON_FAILURE)
- {
- memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);
-
- if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
- }
- else if (cchDest > 0)
- {
- pszDestEnd = pszDest + cchDest - 1;
- cchRemaining = 1;
-
- // null terminate the end of the string
- *pszDestEnd = L'\0';
- }
- }
-
- if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
- {
- if (cchDest > 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- // null terminate the beginning of the string
- *pszDestEnd = L'\0';
- }
- }
- }
- }
-
- if (SUCCEEDED(hr) || (hr == STRSAFE_E_INSUFFICIENT_BUFFER))
- {
- if (ppszDestEnd)
- {
- *ppszDestEnd = pszDestEnd;
- }
-
- if (pcchRemaining)
- {
- *pcchRemaining = cchRemaining;
- }
- }
-
- return hr;
-}
-
-STRSAFEAPI StringLengthWorkerA(const char* psz, size_t cchMax, size_t* pcch)
-{
- HRESULT hr = S_OK;
- size_t cchMaxPrev = cchMax;
-
- while (cchMax && (*psz != '\0'))
- {
- psz++;
- cchMax--;
- }
-
- if (cchMax == 0)
- {
- // the string is longer than cchMax
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
-
- if (SUCCEEDED(hr) && pcch)
- {
- *pcch = cchMaxPrev - cchMax;
- }
-
- return hr;
-}
-
-STRSAFEAPI StringLengthWorkerW(const wchar_t* psz, size_t cchMax, size_t* pcch)
-{
- HRESULT hr = S_OK;
- size_t cchMaxPrev = cchMax;
-
- while (cchMax && (*psz != L'\0'))
- {
- psz++;
- cchMax--;
- }
-
- if (cchMax == 0)
- {
- // the string is longer than cchMax
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
-
- if (SUCCEEDED(hr) && pcch)
- {
- *pcch = cchMaxPrev - cchMax;
- }
-
- return hr;
-}
-#endif // STRSAFE_INLINE
-
-#ifndef STRSAFE_LIB_IMPL
-STRSAFE_INLINE_API StringGetsExWorkerA(char* pszDest, size_t cchDest, size_t cbDest, char** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr = S_OK;
- char* pszDestEnd = pszDest;
- size_t cchRemaining = 0;
-
- // ASSERT(cbDest == (cchDest * sizeof(char)) ||
- // cbDest == (cchDest * sizeof(char)) + (cbDest % sizeof(char)));
-
- // only accept valid flags
- if (dwFlags & (~STRSAFE_VALID_FLAGS))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- if (dwFlags & STRSAFE_IGNORE_NULLS)
- {
- if (pszDest == NULL)
- {
- if ((cchDest != 0) || (cbDest != 0))
- {
- // NULL pszDest and non-zero cchDest/cbDest is invalid
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- }
- }
-
- if (SUCCEEDED(hr))
- {
- if (cchDest <= 1)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- if (cchDest == 1)
- {
- *pszDestEnd = '\0';
- }
-
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- else
- {
- char ch;
-
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- while ((cchRemaining > 1) && (ch = (char)getc(stdin)) != '\n')
- {
- if (ch == EOF)
- {
- if (pszDestEnd == pszDest)
- {
- // we failed to read anything from stdin
- hr = STRSAFE_E_END_OF_FILE;
- }
- break;
- }
-
- *pszDestEnd = ch;
-
- pszDestEnd++;
- cchRemaining--;
- }
-
- if (cchRemaining > 0)
- {
- // there is extra room
- if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
- {
- memset(pszDestEnd + 1, STRSAFE_GET_FILL_PATTERN(dwFlags), ((cchRemaining - 1) * sizeof(char)) + (cbDest % sizeof(char)));
- }
- }
-
- *pszDestEnd = '\0';
- }
- }
- }
-
- if (FAILED(hr))
- {
- if (pszDest)
- {
- if (dwFlags & STRSAFE_FILL_ON_FAILURE)
- {
- memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);
-
- if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
- }
- else if (cchDest > 0)
- {
- pszDestEnd = pszDest + cchDest - 1;
- cchRemaining = 1;
-
- // null terminate the end of the string
- *pszDestEnd = '\0';
- }
- }
-
- if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
- {
- if (cchDest > 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- // null terminate the beginning of the string
- *pszDestEnd = '\0';
- }
- }
- }
- }
-
- if (SUCCEEDED(hr) ||
- (hr == STRSAFE_E_INSUFFICIENT_BUFFER) ||
- (hr == STRSAFE_E_END_OF_FILE))
- {
- if (ppszDestEnd)
- {
- *ppszDestEnd = pszDestEnd;
- }
-
- if (pcchRemaining)
- {
- *pcchRemaining = cchRemaining;
- }
- }
-
- return hr;
-}
-
-STRSAFE_INLINE_API StringGetsExWorkerW(wchar_t* pszDest, size_t cchDest, size_t cbDest, wchar_t** ppszDestEnd, size_t* pcchRemaining, unsigned long dwFlags)
-{
- HRESULT hr = S_OK;
- wchar_t* pszDestEnd = pszDest;
- size_t cchRemaining = 0;
-
- // ASSERT(cbDest == (cchDest * sizeof(char)) ||
- // cbDest == (cchDest * sizeof(char)) + (cbDest % sizeof(char)));
-
- // only accept valid flags
- if (dwFlags & (~STRSAFE_VALID_FLAGS))
- {
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- else
- {
- if (dwFlags & STRSAFE_IGNORE_NULLS)
- {
- if (pszDest == NULL)
- {
- if ((cchDest != 0) || (cbDest != 0))
- {
- // NULL pszDest and non-zero cchDest/cbDest is invalid
- hr = STRSAFE_E_INVALID_PARAMETER;
- }
- }
- }
-
- if (SUCCEEDED(hr))
- {
- if (cchDest <= 1)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- if (cchDest == 1)
- {
- *pszDestEnd = L'\0';
- }
-
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
- }
- else
- {
- wchar_t ch;
-
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- while ((cchRemaining > 1) && (ch = (wchar_t)getwc(stdin)) != L'\n')
- {
- if (ch == EOF)
- {
- if (pszDestEnd == pszDest)
- {
- // we failed to read anything from stdin
- hr = STRSAFE_E_END_OF_FILE;
- }
- break;
- }
-
- *pszDestEnd = ch;
-
- pszDestEnd++;
- cchRemaining--;
- }
-
- if (cchRemaining > 0)
- {
- // there is extra room
- if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
- {
- memset(pszDestEnd + 1, STRSAFE_GET_FILL_PATTERN(dwFlags), ((cchRemaining - 1) * sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
- }
- }
-
- *pszDestEnd = L'\0';
- }
- }
- }
-
- if (FAILED(hr))
- {
- if (pszDest)
- {
- if (dwFlags & STRSAFE_FILL_ON_FAILURE)
- {
- memset(pszDest, STRSAFE_GET_FILL_PATTERN(dwFlags), cbDest);
-
- if (STRSAFE_GET_FILL_PATTERN(dwFlags) == 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
- }
- else if (cchDest > 0)
- {
- pszDestEnd = pszDest + cchDest - 1;
- cchRemaining = 1;
-
- // null terminate the end of the string
- *pszDestEnd = L'\0';
- }
- }
-
- if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
- {
- if (cchDest > 0)
- {
- pszDestEnd = pszDest;
- cchRemaining = cchDest;
-
- // null terminate the beginning of the string
- *pszDestEnd = L'\0';
- }
- }
- }
- }
-
- if (SUCCEEDED(hr) ||
- (hr == STRSAFE_E_INSUFFICIENT_BUFFER) ||
- (hr == STRSAFE_E_END_OF_FILE))
- {
- if (ppszDestEnd)
- {
- *ppszDestEnd = pszDestEnd;
- }
-
- if (pcchRemaining)
- {
- *pcchRemaining = cchRemaining;
- }
- }
-
- return hr;
-}
-#endif // !STRSAFE_LIB_IMPL
-
-
-// Do not call these functions, they are worker functions for internal use within this file
-#ifdef DEPRECATE_SUPPORTED
-#pragma deprecated(StringCopyWorkerA)
-#pragma deprecated(StringCopyWorkerW)
-#pragma deprecated(StringCopyExWorkerA)
-#pragma deprecated(StringCopyExWorkerW)
-#pragma deprecated(StringCatWorkerA)
-#pragma deprecated(StringCatWorkerW)
-#pragma deprecated(StringCatExWorkerA)
-#pragma deprecated(StringCatExWorkerW)
-#pragma deprecated(StringCatNWorkerA)
-#pragma deprecated(StringCatNWorkerW)
-#pragma deprecated(StringCatNExWorkerA)
-#pragma deprecated(StringCatNExWorkerW)
-#pragma deprecated(StringVPrintfWorkerA)
-#pragma deprecated(StringVPrintfWorkerW)
-#pragma deprecated(StringVPrintfExWorkerA)
-#pragma deprecated(StringVPrintfExWorkerW)
-#pragma deprecated(StringLengthWorkerA)
-#pragma deprecated(StringLengthWorkerW)
-#else
-#define StringCopyWorkerA StringCopyWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
-#define StringCopyWorkerW StringCopyWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
-#define StringCopyExWorkerA StringCopyExWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
-#define StringCopyExWorkerW StringCopyExWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
-#define StringCatWorkerA StringCatWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
-#define StringCatWorkerW StringCatWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
-#define StringCatExWorkerA StringCatExWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
-#define StringCatExWorkerW StringCatExWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
-#define StringCatNWorkerA StringCatNWorkerA_instead_use_StringCchCatNA_or_StrincCbCatNA;
-#define StringCatNWorkerW StringCatNWorkerW_instead_use_StringCchCatNW_or_StringCbCatNW;
-#define StringCatNExWorkerA StringCatNExWorkerA_instead_use_StringCchCatNExA_or_StringCbCatNExA;
-#define StringCatNExWorkerW StringCatNExWorkerW_instead_use_StringCchCatNExW_or_StringCbCatNExW;
-#define StringVPrintfWorkerA StringVPrintfWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
-#define StringVPrintfWorkerW StringVPrintfWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
-#define StringVPrintfExWorkerA StringVPrintfExWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
-#define StringVPrintfExWorkerW StringVPrintfExWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
-#define StringLengthWorkerA StringLengthWorkerA_instead_use_StringCchLengthA_or_StringCbLengthA;
-#define StringLengthWorkerW StringLengthWorkerW_instead_use_StringCchLengthW_or_StringCbLengthW;
-#endif // !DEPRECATE_SUPPORTED
-
-
-#ifndef STRSAFE_NO_DEPRECATE
-// Deprecate all of the unsafe functions to generate compiletime errors. If you do not want
-// this then you can #define STRSAFE_NO_DEPRECATE before including this file.
-#ifdef DEPRECATE_SUPPORTED
-
-// First all the names that are a/w variants (or shouldn't be #defined by now anyway).
-#pragma deprecated(lstrcpyA)
-#pragma deprecated(lstrcpyW)
-#pragma deprecated(lstrcatA)
-#pragma deprecated(lstrcatW)
-#pragma deprecated(wsprintfA)
-#pragma deprecated(wsprintfW)
-
-#pragma deprecated(StrCpyW)
-#pragma deprecated(StrCatW)
-#pragma deprecated(StrNCatA)
-#pragma deprecated(StrNCatW)
-#pragma deprecated(StrCatNA)
-#pragma deprecated(StrCatNW)
-#pragma deprecated(wvsprintfA)
-#pragma deprecated(wvsprintfW)
-
-#pragma deprecated(strcpy)
-#pragma deprecated(wcscpy)
-#pragma deprecated(strcat)
-#pragma deprecated(wcscat)
-#pragma deprecated(sprintf)
-#pragma deprecated(swprintf)
-#pragma deprecated(vsprintf)
-#pragma deprecated(vswprintf)
-#pragma deprecated(_snprintf)
-#pragma deprecated(_snwprintf)
-#pragma deprecated(_vsnprintf)
-#pragma deprecated(_vsnwprintf)
-#pragma deprecated(gets)
-#pragma deprecated(_getws)
-
-// Then all the windows.h names - we need to undef and redef based on UNICODE setting
-#undef lstrcpy
-#undef lstrcat
-#undef wsprintf
-#undef wvsprintf
-#pragma deprecated(lstrcpy)
-#pragma deprecated(lstrcat)
-#pragma deprecated(wsprintf)
-#pragma deprecated(wvsprintf)
-#ifdef UNICODE
-#define lstrcpy lstrcpyW
-#define lstrcat lstrcatW
-#define wsprintf wsprintfW
-#define wvsprintf wvsprintfW
-#else
-#define lstrcpy lstrcpyA
-#define lstrcat lstrcatA
-#define wsprintf wsprintfA
-#define wvsprintf wvsprintfA
-#endif
-
-// Then the shlwapi names - they key off UNICODE also.
-#undef StrCpyA
-#undef StrCpy
-#undef StrCatA
-#undef StrCat
-#undef StrNCat
-#undef StrCatN
-#pragma deprecated(StrCpyA)
-#pragma deprecated(StrCatA)
-#pragma deprecated(StrCatN)
-#pragma deprecated(StrCpy)
-#pragma deprecated(StrCat)
-#pragma deprecated(StrNCat)
-#define StrCpyA lstrcpyA
-#define StrCatA lstrcatA
-#define StrCatN StrNCat
-#ifdef UNICODE
-#define StrCpy StrCpyW
-#define StrCat StrCatW
-#define StrNCat StrNCatW
-#else
-#define StrCpy lstrcpyA
-#define StrCat lstrcatA
-#define StrNCat StrNCatA
-#endif
-
-// Then all the CRT names - we need to undef/redef based on _UNICODE value.
-#undef _tcscpy
-#undef _ftcscpy
-#undef _tcscat
-#undef _ftcscat
-#undef _stprintf
-#undef _sntprintf
-#undef _vstprintf
-#undef _vsntprintf
-#undef _getts
-#pragma deprecated(_tcscpy)
-#pragma deprecated(_ftcscpy)
-#pragma deprecated(_tcscat)
-#pragma deprecated(_ftcscat)
-#pragma deprecated(_stprintf)
-#pragma deprecated(_sntprintf)
-#pragma deprecated(_vstprintf)
-#pragma deprecated(_vsntprintf)
-#pragma deprecated(_getts)
-#ifdef _UNICODE
-#define _tcscpy wcscpy
-#define _ftcscpy wcscpy
-#define _tcscat wcscat
-#define _ftcscat wcscat
-#define _stprintf swprintf
-#define _sntprintf _snwprintf
-#define _vstprintf vswprintf
-#define _vsntprintf _vsnwprintf
-#define _getts _getws
-#else
-#define _tcscpy strcpy
-#define _ftcscpy strcpy
-#define _tcscat strcat
-#define _ftcscat strcat
-#define _stprintf sprintf
-#define _sntprintf _snprintf
-#define _vstprintf vsprintf
-#define _vsntprintf _vsnprintf
-#define _getts gets
-#endif
-
-#else // DEPRECATE_SUPPORTED
-
-#undef strcpy
-#define strcpy strcpy_instead_use_StringCbCopyA_or_StringCchCopyA;
-
-#undef wcscpy
-#define wcscpy wcscpy_instead_use_StringCbCopyW_or_StringCchCopyW;
-
-#undef strcat
-#define strcat strcat_instead_use_StringCbCatA_or_StringCchCatA;
-
-#undef wcscat
-#define wcscat wcscat_instead_use_StringCbCatW_or_StringCchCatW;
-
-//#undef sprintf
-//#define sprintf sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA;
-
-//#undef swprintf
-//#define swprintf swprintf_instead_use_StringCbPrintfW_or_StringCchPrintfW;
-
-#undef vsprintf
-#define vsprintf vsprintf_instead_use_StringCbVPrintfA_or_StringCchVPrintfA;
-
-#undef vswprintf
-#define vswprintf vswprintf_instead_use_StringCbVPrintfW_or_StringCchVPrintfW;
-
-#undef _snprintf
-#define _snprintf _snprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA;
-
-#undef _snwprintf
-#define _snwprintf _snwprintf_instead_use_StringCbPrintfW_or_StringCchPrintfW;
-
-#undef _vsnprintf
-#define _vsnprintf _vsnprintf_instead_use_StringCbVPrintfA_or_StringCchVPrintfA;
-
-#undef _vsnwprintf
-#define _vsnwprintf _vsnwprintf_instead_use_StringCbVPrintfW_or_StringCchVPrintfW;
-
-#undef strcpyA
-#define strcpyA strcpyA_instead_use_StringCbCopyA_or_StringCchCopyA;
-
-#undef strcpyW
-#define strcpyW strcpyW_instead_use_StringCbCopyW_or_StringCchCopyW;
-
-#undef lstrcpy
-#define lstrcpy lstrcpy_instead_use_StringCbCopy_or_StringCchCopy;
-
-#undef lstrcpyA
-#define lstrcpyA lstrcpyA_instead_use_StringCbCopyA_or_StringCchCopyA;
-
-#undef lstrcpyW
-#define lstrcpyW lstrcpyW_instead_use_StringCbCopyW_or_StringCchCopyW;
-
-#undef StrCpy
-#define StrCpy StrCpy_instead_use_StringCbCopy_or_StringCchCopy;
-
-#undef StrCpyA
-#define StrCpyA StrCpyA_instead_use_StringCbCopyA_or_StringCchCopyA;
-
-#undef StrCpyW
-#define StrCpyW StrCpyW_instead_use_StringCbCopyW_or_StringCchCopyW;
-
-#undef _tcscpy
-#define _tcscpy _tcscpy_instead_use_StringCbCopy_or_StringCchCopy;
-
-#undef _ftcscpy
-#define _ftcscpy _ftcscpy_instead_use_StringCbCopy_or_StringCchCopy;
-
-#undef lstrcat
-#define lstrcat lstrcat_instead_use_StringCbCat_or_StringCchCat;
-
-#undef lstrcatA
-#define lstrcatA lstrcatA_instead_use_StringCbCatA_or_StringCchCatA;
-
-#undef lstrcatW
-#define lstrcatW lstrcatW_instead_use_StringCbCatW_or_StringCchCatW;
-
-#undef StrCat
-#define StrCat StrCat_instead_use_StringCbCat_or_StringCchCat;
-
-#undef StrCatA
-#define StrCatA StrCatA_instead_use_StringCbCatA_or_StringCchCatA;
-
-#undef StrCatW
-#define StrCatW StrCatW_instead_use_StringCbCatW_or_StringCchCatW;
-
-#undef StrNCat
-#define StrNCat StrNCat_instead_use_StringCbCatN_or_StringCchCatN;
-
-#undef StrNCatA
-#define StrNCatA StrNCatA_instead_use_StringCbCatNA_or_StringCchCatNA;
-
-#undef StrNCatW
-#define StrNCatW StrNCatW_instead_use_StringCbCatNW_or_StringCchCatNW;
-
-#undef StrCatN
-#define StrCatN StrCatN_instead_use_StringCbCatN_or_StringCchCatN;
-
-#undef StrCatNA
-#define StrCatNA StrCatNA_instead_use_StringCbCatNA_or_StringCchCatNA;
-
-#undef StrCatNW
-#define StrCatNW StrCatNW_instead_use_StringCbCatNW_or_StringCchCatNW;
-
-#undef _tcscat
-#define _tcscat _tcscat_instead_use_StringCbCat_or_StringCchCat;
-
-#undef _ftcscat
-#define _ftcscat _ftcscat_instead_use_StringCbCat_or_StringCchCat;
-
-#undef wsprintf
-#define wsprintf wsprintf_instead_use_StringCbPrintf_or_StringCchPrintf;
-
-#undef wsprintfA
-#define wsprintfA wsprintfA_instead_use_StringCbPrintfA_or_StringCchPrintfA;
-
-#undef wsprintfW
-#define wsprintfW wsprintfW_instead_use_StringCbPrintfW_or_StringCchPrintfW;
-
-#undef wvsprintf
-#define wvsprintf wvsprintf_instead_use_StringCbVPrintf_or_StringCchVPrintf;
-
-#undef wvsprintfA
-#define wvsprintfA wvsprintfA_instead_use_StringCbVPrintfA_or_StringCchVPrintfA;
-
-#undef wvsprintfW
-#define wvsprintfW wvsprintfW_instead_use_StringCbVPrintfW_or_StringCchVPrintfW;
-
-#undef _vstprintf
-#define _vstprintf _vstprintf_instead_use_StringCbVPrintf_or_StringCchVPrintf;
-
-#undef _vsntprintf
-#define _vsntprintf _vsntprintf_instead_use_StringCbVPrintf_or_StringCchVPrintf;
-
-#undef _stprintf
-#define _stprintf _stprintf_instead_use_StringCbPrintf_or_StringCchPrintf;
-
-#undef _sntprintf
-#define _sntprintf _sntprintf_instead_use_StringCbPrintf_or_StringCchPrintf;
-
-#undef _getts
-#define _getts _getts_instead_use_StringCbGets_or_StringCchGets;
-
-#undef gets
-#define gets _gets_instead_use_StringCbGetsA_or_StringCchGetsA;
-
-#undef _getws
-#define _getws _getws_instead_use_StringCbGetsW_or_StringCchGetsW;
-
-#endif // !DEPRECATE_SUPPORTED
-#endif // !STRSAFE_NO_DEPRECATE
-
-#ifdef _NTSTRSAFE_H_INCLUDED_
-#pragma warning(pop)
-#endif // _NTSTRSAFE_H_INCLUDED_
-
-#endif // _STRSAFE_H_INCLUDED_
diff --git a/cpp/Wiipair/lib/DelcomDLL.lib b/cpp/Wiipair/lib/DelcomDLL.lib
deleted file mode 100644
index 0c540c6..0000000
Binary files a/cpp/Wiipair/lib/DelcomDLL.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/advapi32.lib b/cpp/Wiipair/lib/advapi32.lib
deleted file mode 100644
index 2812216..0000000
Binary files a/cpp/Wiipair/lib/advapi32.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/comdlg32.lib b/cpp/Wiipair/lib/comdlg32.lib
deleted file mode 100644
index 181fca1..0000000
Binary files a/cpp/Wiipair/lib/comdlg32.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/gdi32.lib b/cpp/Wiipair/lib/gdi32.lib
deleted file mode 100644
index 63172a5..0000000
Binary files a/cpp/Wiipair/lib/gdi32.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/irprops.lib b/cpp/Wiipair/lib/irprops.lib
deleted file mode 100644
index 1761118..0000000
Binary files a/cpp/Wiipair/lib/irprops.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/kernel32.lib b/cpp/Wiipair/lib/kernel32.lib
deleted file mode 100644
index 77b0e53..0000000
Binary files a/cpp/Wiipair/lib/kernel32.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/libcpmt.lib b/cpp/Wiipair/lib/libcpmt.lib
deleted file mode 100644
index 85e91bb..0000000
Binary files a/cpp/Wiipair/lib/libcpmt.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/odbc32.lib b/cpp/Wiipair/lib/odbc32.lib
deleted file mode 100644
index 1add151..0000000
Binary files a/cpp/Wiipair/lib/odbc32.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/odbccp32.lib b/cpp/Wiipair/lib/odbccp32.lib
deleted file mode 100644
index 0f2ef09..0000000
Binary files a/cpp/Wiipair/lib/odbccp32.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/ole32.lib b/cpp/Wiipair/lib/ole32.lib
deleted file mode 100644
index 17d6af8..0000000
Binary files a/cpp/Wiipair/lib/ole32.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/oleaut32.lib b/cpp/Wiipair/lib/oleaut32.lib
deleted file mode 100644
index 1955d00..0000000
Binary files a/cpp/Wiipair/lib/oleaut32.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/shell32.lib b/cpp/Wiipair/lib/shell32.lib
deleted file mode 100644
index b723320..0000000
Binary files a/cpp/Wiipair/lib/shell32.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/user32.lib b/cpp/Wiipair/lib/user32.lib
deleted file mode 100644
index eda26c0..0000000
Binary files a/cpp/Wiipair/lib/user32.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/uuid.lib b/cpp/Wiipair/lib/uuid.lib
deleted file mode 100644
index f6e4ae2..0000000
Binary files a/cpp/Wiipair/lib/uuid.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/wiiuse.lib b/cpp/Wiipair/lib/wiiuse.lib
deleted file mode 100644
index 6425e72..0000000
Binary files a/cpp/Wiipair/lib/wiiuse.lib and /dev/null differ
diff --git a/cpp/Wiipair/lib/winspool.lib b/cpp/Wiipair/lib/winspool.lib
deleted file mode 100644
index 61cb936..0000000
Binary files a/cpp/Wiipair/lib/winspool.lib and /dev/null differ
diff --git a/cpp/Wiipair/src/wiipair.cpp b/cpp/Wiipair/src/wiipair.cpp
deleted file mode 100644
index 764bbe2..0000000
--- a/cpp/Wiipair/src/wiipair.cpp
+++ /dev/null
@@ -1,212 +0,0 @@
-#include
-#include
-#include
-#include
-#include
-#include
-
-DWORD ShowErrorCode(LPTSTR msg, DWORD dw)
-{
- // Retrieve the system error message for the last-error code
-
- LPVOID lpMsgBuf;
-
- FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- dw,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPTSTR) &lpMsgBuf,
- 0,
- NULL
- );
-
- _tprintf(_T("%s: %s"), msg, lpMsgBuf);
-
- LocalFree(lpMsgBuf);
-
- return dw;
-}
-
-
-_TCHAR * FormatBTAddress(BLUETOOTH_ADDRESS address)
-{
- static _TCHAR ret[20];
- _stprintf(ret, _T("%02x:%02x:%02x:%02x:%02x:%02x"),
- address.rgBytes[5],
- address.rgBytes[4],
- address.rgBytes[3],
- address.rgBytes[2],
- address.rgBytes[1],
- address.rgBytes[0]
- );
- return ret;
-}
-
-int _tmain(int argc, _TCHAR* argv[])
-{
- HANDLE hRadios[256];
- int nRadios;
- int nPaired = 0;
-
- ///////////////////////////////////////////////////////////////////////
- // Enumerate BT radios
- ///////////////////////////////////////////////////////////////////////
- {
- HBLUETOOTH_RADIO_FIND hFindRadio;
- BLUETOOTH_FIND_RADIO_PARAMS radioParam;
-
- _tprintf(_T("Enumerating radios...\n"));
-
- radioParam.dwSize = sizeof(BLUETOOTH_FIND_RADIO_PARAMS);
-
- nRadios = 0;
- hFindRadio = BluetoothFindFirstRadio(&radioParam, &hRadios[nRadios++]);
- if (hFindRadio)
- {
- while (BluetoothFindNextRadio(&radioParam, &hRadios[nRadios++]));
- BluetoothFindRadioClose(hFindRadio);
- }
- else
- {
- ShowErrorCode(_T("Error enumerating radios"), GetLastError());
- return (1);
- }
- nRadios--;
- _tprintf(_T("Found %d radios\n"), nRadios);
- }
-
- ///////////////////////////////////////////////////////////////////////
- // Keep looping until we pair with a Wii device
- ///////////////////////////////////////////////////////////////////////
-
- while (nPaired == 0)
- {
- int radio;
-
- for (radio = 0; radio < nRadios; radio++)
- {
- BLUETOOTH_RADIO_INFO radioInfo;
- HBLUETOOTH_DEVICE_FIND hFind;
- BLUETOOTH_DEVICE_INFO btdi;
- BLUETOOTH_DEVICE_SEARCH_PARAMS srch;
-
- radioInfo.dwSize = sizeof(radioInfo);
- btdi.dwSize = sizeof(btdi);
- srch.dwSize = sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS);
-
- ShowErrorCode(_T("BluetoothGetRadioInfo"), BluetoothGetRadioInfo(hRadios[radio], &radioInfo));
-
- _tprintf(_T("Radio %d: %ls %s\n"),
- radio,
- radioInfo.szName,
- FormatBTAddress(radioInfo.address)
- );
-
- srch.fReturnAuthenticated = TRUE;
- srch.fReturnRemembered = TRUE;
- srch.fReturnConnected = TRUE;
- srch.fReturnUnknown = TRUE;
- srch.fIssueInquiry = TRUE;
- srch.cTimeoutMultiplier = 2;
- srch.hRadio = hRadios[radio];
-
- _tprintf(_T("Scanning...\n"));
-
- hFind = BluetoothFindFirstDevice(&srch, &btdi);
-
- if (hFind == NULL)
- {
- if (GetLastError() == ERROR_NO_MORE_ITEMS)
- {
- _tprintf(_T("No bluetooth devices found.\n"));
- }
- else
- {
- ShowErrorCode(_T("Error enumerating devices"), GetLastError());
- return (1);
- }
- }
- else
- {
- do
- {
- _tprintf(_T("Found: %s\n"), btdi.szName);
-
- if (!wcscmp(btdi.szName, L"Nintendo RVL-WBC-01") || !wcscmp(btdi.szName, L"Nintendo RVL-CNT-01"))
- {
- WCHAR pass[6];
- DWORD pcServices = 16;
- GUID guids[16];
- BOOL error = FALSE;
-
- if (!error)
- {
- if (btdi.fRemembered)
- {
- // Make Windows forget pairing
- if (ShowErrorCode(_T("BluetoothRemoveDevice"), BluetoothRemoveDevice(&btdi.Address)) != ERROR_SUCCESS)
- error = TRUE;
- }
- }
-
- // MAC address is passphrase
- pass[0] = radioInfo.address.rgBytes[0];
- pass[1] = radioInfo.address.rgBytes[1];
- pass[2] = radioInfo.address.rgBytes[2];
- pass[3] = radioInfo.address.rgBytes[3];
- pass[4] = radioInfo.address.rgBytes[4];
- pass[5] = radioInfo.address.rgBytes[5];
-
- if (!error)
- {
- // Pair with Wii device
- if (ShowErrorCode(_T("BluetoothAuthenticateDevice"), BluetoothAuthenticateDevice(NULL, hRadios[radio], &btdi, pass, 6)) != ERROR_SUCCESS)
- error = TRUE;
- }
-
- if (!error)
- {
- // If this is not done, the Wii device will not remember the pairing
- if (ShowErrorCode(_T("BluetoothEnumerateInstalledServices"), BluetoothEnumerateInstalledServices(hRadios[radio], &btdi, &pcServices, guids)) != ERROR_SUCCESS)
- error = TRUE;
- }
-
- /*if (!error)
- {
- // Activate service
- if (ShowErrorCode(_T("BluetoothSetServiceState"), BluetoothSetServiceState(hRadios[radio], &btdi, &HumanInterfaceDeviceServiceClass_UUID, BLUETOOTH_SERVICE_ENABLE)) != ERROR_SUCCESS)
- error = TRUE;
- }*/
-
- if (!error)
- {
- nPaired++;
- }
- } // if (!wcscmp(btdi.szName, L"Nintendo RVL-WBC-01") || !wcscmp(btdi.szName, L"Nintendo RVL-CNT-01"))
- }
- while (BluetoothFindNextDevice(hFind, &btdi));
- } // if (hFind == NULL)
- } // for (radio = 0; radio < nRadios; radio++)
-
- Sleep(1000);
- }
-
- ///////////////////////////////////////////////////////////////////////
- // Clean up
- ///////////////////////////////////////////////////////////////////////
-
- {
- int radio;
-
- for (radio = 0; radio < nRadios; radio++)
- {
- CloseHandle(hRadios[radio]);
- }
- }
-
- _tprintf(_T("=============================================\n"), nPaired);
- _tprintf(_T("%d Wii devices paired\n"), nPaired);
-
- return 0;
-}