lstrcpyn Function

This function copies a specified number of characters from a source string into a buffer.

Syntax

LPTSTR lstrcpyn(      
    LPTSTR lpString1,     LPCTSTR lpString2,     int iMaxLength );

Parameters

lpString1
[out] Pointer to a buffer into which the function copies characters. The buffer must be large enough to contain the number of TCHAR values specified by iMaxLength, including room for a terminating null character.
lpString2
[in] Pointer to a null-terminated string from which the function copies characters.
iMaxLength
[in] Specifies the number of TCHAR values to be copied from the string pointed to by lpString2 into the buffer pointed to by lpString1, including a terminating null character. This refers to bytes for ANSI versions of the function or WCHAR values for Unicode versions.

Return Value

If the function succeeds, the return value is a pointer to the buffer. The function can succeed even if the source string is greater than iMaxLength characters.

If the function fails, the return value is NULL and lpString1 may not be null-terminated.

Remarks

security note Security Alert  

Using this function incorrectly can compromise the security of your application. This function uses structured exception handling (SEH) to catch access violations and other errors. When this function catches SEH errors, it returns NULL without null-terminating the string and without notifying the caller of the error. The caller is not safe to assume that insufficient space is the error condition.

If the buffer pointed to by lpString1 is not large enough to contain the copied string, a buffer overrun can occur. When copying an entire string, note that sizeof returns the number of bytes. For example, if lpString1 points to a buffer szString1 which is declared as TCHAR szString[100], then sizeof(szString1) gives the size of the buffer in bytes rather than WCHAR, which could lead to a buffer overflow for the Unicode version of the function.

Buffer overflow situations are the cause of many security problems in applications and can cause a denial of service attack against the application if an access violation occurs. In the worst case, a buffer overrun may allow an attacker to inject executable code into your process, especially if lpString1 is a stack-based buffer.

Using sizeof(szString1)/sizeof(szString1[0]) gives the proper size of the buffer.

Consider using StringCchCopy instead; use either StringCchCopy(buffer, src, sizeof(buffer)/sizeof(buffer[0]);, being aware that buffer must not be a pointer or use StringCchCopy(buffer, src, ARRAYSIZE(buffer);, being aware that, when copying to a pointer, the caller is responsible for passing in the size of the pointed-to memory in characters.

Review Security Considerations: Windows User Interface before continuing.

The buffer pointed to by lpString1 must be large enough to include a terminating null character, and the string length value specified by iMaxLength includes room for a terminating null character. The following code copies the string "abc", followed by a terminating null character, to chBuffer.

TCHAR chBuffer[512];
  lstrcpyn(chBuffer, "abcdefghijklmnop", 4);
  

The lstrcpyn function has an undefined behavior if source and destination buffers overlap.

Windows 95/98/Me: lstrcpynW is supported by the Microsoft Layer for Unicode (MSLU). To use this, you must add certain files to your application, as outlined in Microsoft Layer for Unicode on Windows 95/98/Me Systems.

Function Information

Minimum DLL Versionkernel32.dll
HeaderDeclared in Winbase.h, include Windows.h
Import libraryKernel32.lib
Minimum operating systems Windows 95, Windows NT 3.5
UnicodeImplemented as ANSI and Unicode versions.

See Also

Tags :


Page view tracker