Fixed ANSI/OEM <--> Unicode conversions

svn path=/trunk/; revision=1057
This commit is contained in:
Eric Kohl 2000-03-15 12:25:47 +00:00
parent 1c5d2b7204
commit 9658579d48
3 changed files with 682 additions and 419 deletions

View file

@ -1,4 +1,5 @@
/*
/* $Id: cnotify.c,v 1.2 2000/03/15 12:25:47 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: lib/kernel32/file/find.c
@ -7,9 +8,11 @@
* UPDATE HISTORY:
* Created 01/11/98
*/
#include <windows.h>
#include <wstring.h>
WINBOOL
FindCloseChangeNotification (
HANDLE hChangeHandle
@ -18,6 +21,7 @@ FindCloseChangeNotification(
return FALSE;
}
HANDLE
STDCALL
FindFirstChangeNotificationA (
@ -26,24 +30,34 @@ FindFirstChangeNotificationA(
DWORD dwNotifyFilter
)
{
ULONG i;
UNICODE_STRING PathNameU;
ANSI_STRING PathName;
HANDLE Result;
WCHAR PathNameW[MAX_PATH];
RtlInitAnsiString (&PathName,
(LPSTR)lpPathName);
/* convert ansi (or oem) string to unicode */
if (bIsFileApiAnsi)
RtlAnsiStringToUnicodeString (&PathNameU,
&PathName,
TRUE);
else
RtlOemStringToUnicodeString (&PathNameU,
&PathName,
TRUE);
Result = FindFirstChangeNotificationW (PathNameU.Buffer,
bWatchSubtree,
dwNotifyFilter);
RtlFreeHeap (RtlGetProcessHeap (),
0,
RootPathNameU.Buffer);
i = 0;
while ((*lpPathName)!=0 && i < MAX_PATH)
{
PathNameW[i] = *lpPathName;
lpPathName++;
i++;
return Result;
}
PathNameW[i] = 0;
return FindFirstChangeNotificationW(PathNameW, bWatchSubtree, dwNotifyFilter );
}
HANDLE
STDCALL
@ -56,6 +70,7 @@ FindFirstChangeNotificationW(
return NULL;
}
WINBOOL
STDCALL
FindNextChangeNotification (
@ -65,4 +80,4 @@ FindNextChangeNotification(
return FALSE;
}
/* EOF */

View file

@ -1,4 +1,4 @@
/* $Id: find.c,v 1.23 2000/01/11 17:30:16 ekohl Exp $
/* $Id: find.c,v 1.24 2000/03/15 12:25:47 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
@ -12,6 +12,7 @@
/* INCLUDES *****************************************************************/
#include <ddk/ntddk.h>
#include <ntdll/rtl.h>
#include <windows.h>
#include <wchar.h>
#include <string.h>
@ -58,22 +59,37 @@ typedef struct _WIN32_FIND_DATA_ASCII {
/* FUNCTIONS *****************************************************************/
static void FileDataToWin32Data(LPWIN32_FIND_DATA lpFindFileData, PKERNEL32_FIND_FILE_DATA IData)
static void
FileDataToWin32Data (
LPWIN32_FIND_DATA lpFindFileData,
PKERNEL32_FIND_FILE_DATA IData
)
{
lpFindFileData->dwFileAttributes = IData->FileInfo.FileAttributes;
memcpy(&lpFindFileData->ftCreationTime,&IData->FileInfo.CreationTime,sizeof(FILETIME));
memcpy(&lpFindFileData->ftLastAccessTime,&IData->FileInfo.LastAccessTime,sizeof(FILETIME));
memcpy(&lpFindFileData->ftLastWriteTime,&IData->FileInfo.LastWriteTime,sizeof(FILETIME));
memcpy (&lpFindFileData->ftCreationTime,
&IData->FileInfo.CreationTime,
sizeof(FILETIME));
memcpy (&lpFindFileData->ftLastAccessTime,
&IData->FileInfo.LastAccessTime,
sizeof(FILETIME));
memcpy (&lpFindFileData->ftLastWriteTime,
&IData->FileInfo.LastWriteTime,
sizeof(FILETIME));
lpFindFileData->nFileSizeHigh = IData->FileInfo.EndOfFile.u.HighPart;
lpFindFileData->nFileSizeLow = IData->FileInfo.EndOfFile.u.LowPart;
}
WINBOOL STDCALL InternalFindNextFile(HANDLE hFindFile,
LPWIN32_FIND_DATA lpFindFileData)
WINBOOL
STDCALL
InternalFindNextFile (
HANDLE hFindFile,
LPWIN32_FIND_DATA lpFindFileData
)
{
PKERNEL32_FIND_FILE_DATA IData;
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
PKERNEL32_FIND_FILE_DATA IData;
IData = (PKERNEL32_FIND_FILE_DATA)hFindFile;
@ -90,77 +106,89 @@ WINBOOL STDCALL InternalFindNextFile(HANDLE hFindFile,
&(IData->PatternStr),
FALSE);
DPRINT("Found %S\n",IData->FileInfo.FileName);
if (Status != STATUS_SUCCESS)
if (!NT_SUCCESS(Status))
{
return(FALSE);
SetLastError (RtlNtStatusToDosError (Status));
return FALSE;
}
FileDataToWin32Data (lpFindFileData, IData);
return(TRUE);
return TRUE;
}
HANDLE STDCALL InternalFindFirstFile(LPCWSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData)
HANDLE
STDCALL
InternalFindFirstFile (
LPCWSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData
)
{
WCHAR CurrentDirectory[MAX_PATH];
WCHAR Pattern[MAX_PATH];
WCHAR Directory[MAX_PATH];
PWSTR End;
PKERNEL32_FIND_FILE_DATA IData;
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING DirectoryNameStr;
PKERNEL32_FIND_FILE_DATA IData;
IO_STATUS_BLOCK IoStatusBlock;
UNICODE_STRING NtPathU;
NTSTATUS Status;
PWSTR End;
DPRINT("FindFirstFileW(lpFileName %S, lpFindFileData %x)\n",
lpFileName, lpFindFileData);
GetFullPathNameW(lpFileName, MAX_PATH, CurrentDirectory, NULL);
Directory[0] = '\\';
Directory[1] = '?';
Directory[2] = '?';
Directory[3] = '\\';
Directory[4] = 0;
DPRINT("Directory %S\n",Directory);
wcscat(Directory, CurrentDirectory);
DPRINT("Directory %S\n",Directory);
End = wcsrchr(Directory, '\\');
*End = 0;
if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFileName,
&NtPathU,
&End,
NULL))
return FALSE;
wcscpy(Pattern, End+1);
*(End+1) = 0;
*End = '\\';
DPRINT("NtPathU \'%S\' End \'%S\'\n", NtPathU.Buffer, End);
/* change pattern: "*.*" --> "*" */
if (!wcscmp(Pattern, L"*.*"))
Pattern[1] = 0;
DPRINT("Directory %S Pattern %S\n",Directory,Pattern);
IData = HeapAlloc(GetProcessHeap(),
IData = RtlAllocateHeap (RtlGetProcessHeap (),
HEAP_ZERO_MEMORY,
sizeof(KERNEL32_FIND_FILE_DATA));
RtlInitUnicodeString(&DirectoryNameStr, Directory);
/* move seach pattern to separate string */
RtlCreateUnicodeString (&IData->PatternStr,
End);
*End = 0;
NtPathU.Length = wcslen(NtPathU.Buffer)*sizeof(WCHAR);
/* change pattern: "*.*" --> "*" */
if (!wcscmp (IData->PatternStr.Buffer, L"*.*"))
{
IData->PatternStr.Buffer[1] = 0;
IData->PatternStr.Length = sizeof(WCHAR);
}
DPRINT("NtPathU \'%S\' Pattern \'%S\'\n",
NtPathU.Buffer, IData->PatternStr.Buffer);
InitializeObjectAttributes (&ObjectAttributes,
&DirectoryNameStr,
&NtPathU,
0,
NULL,
NULL);
if (ZwOpenFile(&IData->DirectoryHandle,
Status = NtOpenFile (&IData->DirectoryHandle,
FILE_LIST_DIRECTORY,
&ObjectAttributes,
&IoStatusBlock,
FILE_OPEN_IF,
OPEN_EXISTING)!=STATUS_SUCCESS)
OPEN_EXISTING);
RtlFreeHeap (RtlGetProcessHeap (),
0,
NtPathU.Buffer);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap (RtlGetProcessHeap (), 0, IData->PatternStr.Buffer);
RtlFreeHeap (RtlGetProcessHeap (), 0, IData);
SetLastError (RtlNtStatusToDosError (Status));
return(NULL);
}
RtlInitUnicodeString(&(IData->PatternStr), Pattern);
NtQueryDirectoryFile(IData->DirectoryHandle,
Status = NtQueryDirectoryFile (IData->DirectoryHandle,
NULL,
NULL,
NULL,
@ -172,63 +200,104 @@ HANDLE STDCALL InternalFindFirstFile(LPCWSTR lpFileName,
TRUE,
&(IData->PatternStr),
FALSE);
if (!NT_SUCCESS(Status))
{
DPRINT("Status %lx\n", Status);
RtlFreeHeap (RtlGetProcessHeap (), 0, IData->PatternStr.Buffer);
RtlFreeHeap (RtlGetProcessHeap (), 0, IData);
SetLastError (RtlNtStatusToDosError (Status));
return NULL;
}
DPRINT("Found %S\n",IData->FileInfo.FileName);
FileDataToWin32Data(lpFindFileData, IData);
return(IData);
return IData;
}
HANDLE
STDCALL
FindFirstFileA(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData)
FindFirstFileA (
LPCTSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData
)
{
WCHAR lpFileNameW[MAX_PATH];
ULONG i;
PKERNEL32_FIND_FILE_DATA IData;
PWIN32_FIND_DATA_ASCII Ret;
UNICODE_STRING FileNameU;
ANSI_STRING FileName;
i = 0;
while (lpFileName[i]!=0)
{
lpFileNameW[i] = lpFileName[i];
i++;
}
lpFileNameW[i] = 0;
RtlInitAnsiString (&FileName,
(LPSTR)lpFileName);
/* convert ansi (or oem) string to unicode */
if (bIsFileApiAnsi)
RtlAnsiStringToUnicodeString (&FileNameU,
&FileName,
TRUE);
else
RtlOemStringToUnicodeString (&FileNameU,
&FileName,
TRUE);
IData = InternalFindFirstFile (FileNameU.Buffer, lpFindFileData);
RtlFreeHeap (RtlGetProcessHeap (),
0,
FileNameU.Buffer);
IData = InternalFindFirstFile(lpFileNameW,lpFindFileData);
if (IData == NULL)
{
DPRINT("Failing request\n");
return(INVALID_HANDLE_VALUE);
return INVALID_HANDLE_VALUE;
}
Ret = (PWIN32_FIND_DATA_ASCII)lpFindFileData;
DPRINT("IData->FileInfo.FileNameLength %d\n",
IData->FileInfo.FileNameLength);
for (i=0; i<IData->FileInfo.FileNameLength; i++)
{
Ret->cFileName[i] = IData->FileInfo.FileName[i];
}
Ret->cFileName[i] = 0;
FileNameU.Length = IData->FileInfo.FileNameLength * sizeof(WCHAR);
FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR);
FileNameU.Buffer = IData->FileInfo.FileName;
FileName.Length = 0;
FileName.MaximumLength = MAX_PATH;
FileName.Buffer = Ret->cFileName;
/* convert unicode string to ansi (or oem) */
if (bIsFileApiAnsi)
RtlUnicodeStringToAnsiString (&FileName,
&FileNameU,
FALSE);
else
RtlUnicodeStringToOemString (&FileName,
&FileNameU,
FALSE);
DPRINT("IData->FileInfo.ShortNameLength %d\n",
IData->FileInfo.ShortNameLength);
if (IData->FileInfo.ShortNameLength > 13)
{
IData->FileInfo.ShortNameLength = 13;
}
for (i=0; i<IData->FileInfo.ShortNameLength; i++)
{
Ret->cAlternateFileName[i] = IData->FileInfo.ShortName[i];
}
Ret->cAlternateFileName[i] = 0;
FileNameU.Length = IData->FileInfo.ShortNameLength * sizeof(WCHAR);
FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR);
FileNameU.Buffer = IData->FileInfo.FileName;
return(IData);
FileName.Length = 0;
FileName.MaximumLength = 14;
FileName.Buffer = Ret->cAlternateFileName;
/* convert unicode string to ansi (or oem) */
if (bIsFileApiAnsi)
RtlUnicodeStringToAnsiString (&FileName,
&FileNameU,
FALSE);
else
RtlUnicodeStringToOemString (&FileName,
&FileNameU,
FALSE);
return IData;
}
@ -238,44 +307,74 @@ FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData)
{
PWIN32_FIND_DATA_ASCII Ret;
PKERNEL32_FIND_FILE_DATA IData;
ULONG i;
UNICODE_STRING FileNameU;
ANSI_STRING FileName;
IData = (PKERNEL32_FIND_FILE_DATA)hFindFile;
if (IData == NULL)
{
return(FALSE);
return FALSE;
}
if (!InternalFindNextFile (hFindFile, lpFindFileData))
{
DPRINT("InternalFindNextFile() failed\n");
return(FALSE);
return FALSE;
}
Ret = (PWIN32_FIND_DATA_ASCII)lpFindFileData;
DPRINT("IData->FileInfo.FileNameLength %d\n",
IData->FileInfo.FileNameLength);
for (i=0; i<IData->FileInfo.FileNameLength; i++)
{
Ret->cFileName[i] = IData->FileInfo.FileName[i];
}
Ret->cFileName[i] = 0;
FileNameU.Length = IData->FileInfo.FileNameLength * sizeof(WCHAR);
FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR);
FileNameU.Buffer = IData->FileInfo.FileName;
FileName.Length = 0;
FileName.MaximumLength = MAX_PATH;
FileName.Buffer = Ret->cFileName;
/* convert unicode string to ansi (or oem) */
if (bIsFileApiAnsi)
RtlUnicodeStringToAnsiString (&FileName,
&FileNameU,
FALSE);
else
RtlUnicodeStringToOemString (&FileName,
&FileNameU,
FALSE);
DPRINT("IData->FileInfo.ShortNameLength %d\n",
IData->FileInfo.ShortNameLength);
for (i=0; i<IData->FileInfo.ShortNameLength; i++)
{
Ret->cAlternateFileName[i] = IData->FileInfo.ShortName[i];
}
Ret->cAlternateFileName[i] = 0;
return(TRUE);
FileNameU.Length = IData->FileInfo.ShortNameLength * sizeof(WCHAR);
FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR);
FileNameU.Buffer = IData->FileInfo.FileName;
FileName.Length = 0;
FileName.MaximumLength = 14;
FileName.Buffer = Ret->cAlternateFileName;
/* convert unicode string to ansi (or oem) */
if (bIsFileApiAnsi)
RtlUnicodeStringToAnsiString (&FileName,
&FileNameU,
FALSE);
else
RtlUnicodeStringToOemString (&FileName,
&FileNameU,
FALSE);
return TRUE;
}
BOOL
STDCALL
FindClose(HANDLE hFindFile)
FindClose (
HANDLE hFindFile
)
{
PKERNEL32_FIND_FILE_DATA IData;
@ -284,12 +383,17 @@ FindClose(HANDLE hFindFile)
if (hFindFile || hFindFile == INVALID_HANDLE_VALUE)
{
SetLastError (ERROR_INVALID_HANDLE);
return(FALSE);
return FALSE;
}
IData = (PKERNEL32_FIND_FILE_DATA)hFindFile;
CloseHandle (IData->DirectoryHandle);
HeapFree(GetProcessHeap(), 0, IData);
return(TRUE);
if (IData->PatternStr.Buffer)
RtlFreeHeap (RtlGetProcessHeap (), 0, IData->PatternStr.Buffer);
RtlFreeHeap (RtlGetProcessHeap (), 0, IData);
return TRUE;
}
@ -304,14 +408,22 @@ FindFirstFileW (
PKERNEL32_FIND_FILE_DATA IData;
IData = InternalFindFirstFile (lpFileName, lpFindFileData);
if (IData == NULL)
{
DPRINT("Failing request\n");
return INVALID_HANDLE_VALUE;
}
Ret = (PWIN32_FIND_DATA_UNICODE)lpFindFileData;
memcpy(Ret->cFileName, IData->FileInfo.FileName,
memcpy (Ret->cFileName,
IData->FileInfo.FileName,
IData->FileInfo.FileNameLength);
memcpy(Ret->cAlternateFileName, IData->FileInfo.ShortName,
memcpy (Ret->cAlternateFileName,
IData->FileInfo.ShortName,
IData->FileInfo.ShortNameLength);
return(IData);
return IData;
}
@ -328,17 +440,21 @@ FindNextFileW (
IData = (PKERNEL32_FIND_FILE_DATA)hFindFile;
if (!InternalFindNextFile(hFindFile, lpFindFileData))
{
return(FALSE);
DPRINT("Failing request\n");
return FALSE;
}
Ret = (PWIN32_FIND_DATA_UNICODE)lpFindFileData;
memcpy(Ret->cFileName, IData->FileInfo.FileName,
memcpy (Ret->cFileName,
IData->FileInfo.FileName,
IData->FileInfo.FileNameLength);
memcpy(Ret->cAlternateFileName, IData->FileInfo.ShortName,
memcpy (Ret->cAlternateFileName,
IData->FileInfo.ShortName,
IData->FileInfo.ShortNameLength);
return(TRUE);
return TRUE;
}
/* EOF */

View file

@ -20,8 +20,6 @@
#include <ddk/ntddk.h>
#include <windows.h>
#include <wchar.h>
#include <string.h>
#define NDEBUG
#include <kernel32/kernel32.h>
@ -117,7 +115,6 @@ GetLogicalDrives(VOID)
}
WINBOOL
STDCALL
GetDiskFreeSpaceA (
@ -128,27 +125,46 @@ GetDiskFreeSpaceA(
LPDWORD lpTotalNumberOfClusters
)
{
WCHAR RootPathNameW[MAX_PATH];
UNICODE_STRING RootPathNameU;
ANSI_STRING RootPathName;
WINBOOL Result;
RtlInitAnsiString (&RootPathName,
(LPSTR)lpRootPathName);
RtlInitUnicodeString (&RootPathNameU,
NULL);
if (lpRootPathName)
{
ULONG i = 0;
while ((*lpRootPathName)!=0 && i < MAX_PATH)
{
RootPathNameW[i] = *lpRootPathName;
lpRootPathName++;
i++;
}
RootPathNameW[i] = 0;
/* convert ansi (or oem) string to unicode */
if (bIsFileApiAnsi)
RtlAnsiStringToUnicodeString (&RootPathNameU,
&RootPathName,
TRUE);
else
RtlOemStringToUnicodeString (&RootPathNameU,
&RootPathName,
TRUE);
}
return GetDiskFreeSpaceW(lpRootPathName?RootPathNameW:NULL,
Result = GetDiskFreeSpaceW (RootPathNameU.Buffer,
lpSectorsPerCluster,
lpBytesPerSector,
lpNumberOfFreeClusters,
lpTotalNumberOfClusters);
if (lpRootPathName)
{
RtlFreeHeap (RtlGetProcessHeap (),
0,
RootPathNameU.Buffer);
}
return Result;
}
WINBOOL
STDCALL
GetDiskFreeSpaceW(
@ -203,6 +219,7 @@ GetDiskFreeSpaceW(
return TRUE;
}
WINBOOL
STDCALL
GetDiskFreeSpaceExA (
@ -212,24 +229,42 @@ GetDiskFreeSpaceExA(
PULARGE_INTEGER lpTotalNumberOfFreeBytes
)
{
WCHAR DirectoryNameW[MAX_PATH];
UNICODE_STRING DirectoryNameU;
ANSI_STRING DirectoryName;
WINBOOL Result;
RtlInitAnsiString (&DirectoryName,
(LPSTR)lpDirectoryName);
RtlInitUnicodeString (&DirectoryNameU,
NULL);
if (lpDirectoryName)
{
ULONG i = 0;
while ((*lpDirectoryName)!=0 && i < MAX_PATH)
{
DirectoryNameW[i] = *lpDirectoryName;
lpDirectoryName++;
i++;
}
DirectoryNameW[i] = 0;
/* convert ansi (or oem) string to unicode */
if (bIsFileApiAnsi)
RtlAnsiStringToUnicodeString (&DirectoryNameU,
&DirectoryName,
TRUE);
else
RtlOemStringToUnicodeString (&DirectoryNameU,
&DirectoryName,
TRUE);
}
return GetDiskFreeSpaceExW(lpDirectoryName?DirectoryNameW:NULL,
Result = GetDiskFreeSpaceExW (DirectoryNameU.Buffer,
lpFreeBytesAvailableToCaller,
lpTotalNumberOfBytes,
lpTotalNumberOfFreeBytes);
if (lpDirectoryName)
{
RtlFreeHeap (RtlGetProcessHeap (),
0,
DirectoryNameU.Buffer);
}
return Result;
}
@ -302,19 +337,33 @@ GetDriveTypeA(
LPCSTR lpRootPathName
)
{
ULONG i;
WCHAR RootPathNameW[MAX_PATH];
i = 0;
while ((*lpRootPathName)!=0 && i < MAX_PATH)
{
RootPathNameW[i] = *lpRootPathName;
lpRootPathName++;
i++;
}
RootPathNameW[i] = 0;
return GetDriveTypeW(RootPathNameW);
UNICODE_STRING RootPathNameU;
ANSI_STRING RootPathName;
UINT Result;
RtlInitAnsiString (&RootPathName,
(LPSTR)lpRootPathName);
/* convert ansi (or oem) string to unicode */
if (bIsFileApiAnsi)
RtlAnsiStringToUnicodeString (&RootPathNameU,
&RootPathName,
TRUE);
else
RtlOemStringToUnicodeString (&RootPathNameU,
&RootPathName,
TRUE);
Result = GetDriveTypeW (RootPathNameU.Buffer);
RtlFreeHeap (RtlGetProcessHeap (),
0,
RootPathNameU.Buffer);
return Result;
}
UINT
STDCALL
GetDriveTypeW (
@ -327,29 +376,30 @@ GetDriveTypeW(
HANDLE hFile;
NTSTATUS errCode;
hFile = CreateFileW(
lpRootPathName,
hFile = CreateFileW (lpRootPathName,
GENERIC_ALL,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
NULL);
errCode = NtQueryVolumeInformationFile(hFile,&IoStatusBlock,&FileFsDevice, sizeof(FILE_FS_DEVICE_INFORMATION),FileFsDeviceInformation);
if ( !NT_SUCCESS(errCode) ) {
errCode = NtQueryVolumeInformationFile (hFile,
&IoStatusBlock,
&FileFsDevice,
sizeof(FILE_FS_DEVICE_INFORMATION),
FileFsDeviceInformation);
if (!NT_SUCCESS(errCode))
{
CloseHandle(hFile);
SetLastError(RtlNtStatusToDosError(errCode));
return 0;
}
CloseHandle(hFile);
return (UINT)FileFsDevice.DeviceType;
}
WINBOOL
STDCALL
GetVolumeInformationA (
@ -363,39 +413,90 @@ GetVolumeInformationA(
DWORD nFileSystemNameSize
)
{
ULONG i;
WCHAR RootPathNameW[MAX_PATH];
WCHAR VolumeNameBufferW[MAX_PATH];
WCHAR FileSystemNameBufferW[MAX_PATH];
UNICODE_STRING RootPathNameU;
UNICODE_STRING FileSystemNameU;
UNICODE_STRING VolumeNameU;
ANSI_STRING RootPathName;
ANSI_STRING VolumeName;
ANSI_STRING FileSystemName;
WINBOOL Result;
RtlInitAnsiString (&RootPathName,
(LPSTR)lpRootPathName);
i = 0;
while ((*lpRootPathName)!=0 && i < MAX_PATH)
{
RootPathNameW[i] = *lpRootPathName;
lpRootPathName++;
i++;
}
RootPathNameW[i] = 0;
/* convert ansi (or oem) string to unicode */
if (bIsFileApiAnsi)
RtlAnsiStringToUnicodeString (&RootPathNameU,
&RootPathName,
TRUE);
else
RtlOemStringToUnicodeString (&RootPathNameU,
&RootPathName,
TRUE);
if ( GetVolumeInformationW(RootPathNameW,
VolumeNameBufferW,
VolumeNameU.Length = 0;
VolumeNameU.MaximumLength = nVolumeNameSize * sizeof(WCHAR);
VolumeNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
0,
VolumeNameU.MaximumLength);
FileSystemNameU.Length = 0;
FileSystemNameU.MaximumLength = nFileSystemNameSize * sizeof(WCHAR);
FileSystemNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
0,
FileSystemNameU.MaximumLength);
Result = GetVolumeInformationW (RootPathNameU.Buffer,
VolumeNameU.Buffer,
nVolumeNameSize,
lpVolumeSerialNumber,
lpMaximumComponentLength,
lpFileSystemFlags,
FileSystemNameBufferW,
nFileSystemNameSize ) ) {
for(i=0;i<nVolumeNameSize;i++)
lpVolumeNameBuffer[i] = (CHAR)VolumeNameBufferW[i];
FileSystemNameU.Buffer,
nFileSystemNameSize);
for(i=0;i<nFileSystemNameSize;i++)
lpFileSystemNameBuffer[i] = (CHAR)FileSystemNameBufferW[i];
if (Result)
{
VolumeName.Length = 0;
VolumeName.MaximumLength = nVolumeNameSize;
VolumeName.Buffer = lpVolumeNameBuffer;
return TRUE;
FileSystemName.Length = 0;
FileSystemName.MaximumLength = nFileSystemNameSize;
FileSystemName.Buffer = lpFileSystemNameBuffer;
/* convert unicode strings to ansi (or oem) */
if (bIsFileApiAnsi)
{
RtlUnicodeStringToAnsiString (&VolumeName,
&VolumeNameU,
FALSE);
RtlUnicodeStringToAnsiString (&FileSystemName,
&FileSystemNameU,
FALSE);
}
else
{
RtlUnicodeStringToOemString (&VolumeName,
&VolumeNameU,
FALSE);
RtlUnicodeStringToOemString (&FileSystemName,
&FileSystemNameU,
FALSE);
}
}
return FALSE;
RtlFreeHeap (RtlGetProcessHeap (),
0,
RootPathNameU.Buffer);
RtlFreeHeap (RtlGetProcessHeap (),
0,
VolumeNameU.Buffer);
RtlFreeHeap (RtlGetProcessHeap (),
0,
FileSystemNameU.Buffer);
return Result;
}
@ -459,10 +560,17 @@ GetVolumeInformationW(
*lpVolumeSerialNumber = FileFsVolume->VolumeSerialNumber;
if (lpVolumeNameBuffer)
wcsncpy(lpVolumeNameBuffer, FileFsVolume->VolumeLabel,min(nVolumeNameSize,MAX_PATH));
wcsncpy (lpVolumeNameBuffer,
FileFsVolume->VolumeLabel,
min(nVolumeNameSize,MAX_PATH));
errCode = NtQueryVolumeInformationFile(hFile,&IoStatusBlock,FileFsAttribute, FS_ATTRIBUTE_BUFFER_SIZE,FileFsAttributeInformation);
if ( !NT_SUCCESS(errCode) ) {
errCode = NtQueryVolumeInformationFile (hFile,
&IoStatusBlock,
FileFsAttribute,
FS_ATTRIBUTE_BUFFER_SIZE,
FileFsAttributeInformation);
if (!NT_SUCCESS(errCode))
{
DPRINT("Status: %x\n", errCode);
CloseHandle(hFile);
SetLastError(RtlNtStatusToDosError(errCode));
@ -480,6 +588,7 @@ GetVolumeInformationW(
return TRUE;
}
WINBOOL
STDCALL
SetVolumeLabelA (
@ -487,30 +596,51 @@ SetVolumeLabelA(
LPCSTR lpVolumeName
)
{
WCHAR RootPathNameW[MAX_PATH];
WCHAR VolumeNameW[MAX_PATH];
UINT i;
UNICODE_STRING RootPathNameU;
ANSI_STRING RootPathName;
UNICODE_STRING VolumeNameU;
ANSI_STRING VolumeName;
WINBOOL Result;
i = 0;
while ((*lpRootPathName)!=0 && i < MAX_PATH)
{
RootPathNameW[i] = *lpRootPathName;
lpRootPathName++;
i++;
}
RootPathNameW[i] = 0;
RtlInitAnsiString (&RootPathName,
(LPSTR)lpRootPathName);
RtlInitAnsiString (&VolumeName,
(LPSTR)lpVolumeName);
i = 0;
while ((*lpVolumeName)!=0 && i < MAX_PATH)
/* convert ansi (or oem) strings to unicode */
if (bIsFileApiAnsi)
{
VolumeNameW[i] = *lpVolumeName;
lpVolumeName++;
i++;
RtlAnsiStringToUnicodeString (&RootPathNameU,
&RootPathName,
TRUE);
RtlAnsiStringToUnicodeString (&VolumeNameU,
&VolumeName,
TRUE);
}
VolumeNameW[i] = 0;
return SetVolumeLabelW(RootPathNameW,VolumeNameW);
else
{
RtlOemStringToUnicodeString (&RootPathNameU,
&RootPathName,
TRUE);
RtlOemStringToUnicodeString (&VolumeNameU,
&VolumeName,
TRUE);
}
Result = SetVolumeLabelW (RootPathNameU.Buffer,
VolumeNameU.Buffer);
RtlFreeHeap (RtlGetProcessHeap (),
0,
RootPathNameU.Buffer);
RtlFreeHeap (RtlGetProcessHeap (),
0,
VolumeNameU.Buffer);
return Result;
}
WINBOOL
STDCALL
SetVolumeLabelW (
@ -520,3 +650,5 @@ SetVolumeLabelW(
{
return FALSE;
}
/* EOF */