NT4/private/sdktools/winobj/wflabel.c
2020-09-30 17:12:29 +02:00

131 lines
3.8 KiB
C

/****************************************************************************/
/* */
/* WFLABEL.C - */
/* */
/* Windows File System Diskette Labelling Routines */
/* */
/****************************************************************************/
#include "winfile.h"
#include "lstrfns.h"
/*--------------------------------------------------------------------------*/
/* */
/* CreateVolumeLabel() - */
/* */
/*--------------------------------------------------------------------------*/
INT APIENTRY CreateVolumeLabel(INT nDrive, LPSTR lpNewVolLabel)
{
HFILE fh;
register INT i;
register LPSTR p;
CHAR szFullVolName[16]; /* Sample: A:\12345678.EXT,\0 */
LPSTR lpStart = lpNewVolLabel;
lstrcpy((LPSTR)szFullVolName, GetRootPath((WORD)nDrive));
/* If the volume label has more than 8 chars, we must seperate the
* name and the extension by a '.'
*/
p = &szFullVolName[3];
/* Copy the file 8 characters of the VolLabel */
for (i=0; i < 8; i++)
{
if (!(*p++ = *lpNewVolLabel++))
break;
}
if (i == 8)
{
/* Seperate the extension part of it with a '.' */
*p++ = '.';
/* Copy the extension */
i = 0;
while (*p++ = *lpNewVolLabel++)
{
if (++i == 3)
{
#ifdef DBCS
/* Make sure we do not end on a lead byte; notice this is not
* necessary if the label came from an edit box with
* EM_LIMITEXT of 11; also notice that according to the
* DBCS seminar notes, we do NOT need this check before the '.'
*/
for (lpNewVolLabel=lpStart; lpNewVolLabel-lpStart<11;
lpNewVolLabel = AnsiNext(lpNewVolLabel))
/* do nothing */ ;
if (lpNewVolLabel-lpStart > 11)
--p;
#endif
*p = TEXT('\0');
break;
}
}
}
/* Create a file with the attribute "VOLUME LABEL" */
if ((fh = CreateVolumeFile(szFullVolName)) == (HFILE)-1)
return(-1);
M_lclose(fh);
return(0);
}
/*--------------------------------------------------------------------------*/
/* */
/* SetVolumeLabel() - */
/* */
/*--------------------------------------------------------------------------*/
INT APIENTRY MySetVolumeLabel(INT nDrive, BOOL bOldVolLabelExists, LPSTR lpNewVolLabel)
{
INT iRet = 0;
CHAR szTemp[MAXFILENAMELEN];
AnsiToOem(lpNewVolLabel, szTemp);
// invalid chars copied from DOS user docs
#ifdef STRCSPN_IS_DEFINED_OR_LABEL_MENUITEM_IS_ENABLED
if (szTemp[StrCSpn(szTemp, " *?/\\|.,;:+=[]()&^<>\"")] != '\0')
return (-1);
#endif
/* Check if there is an old volume label. */
if (bOldVolLabelExists)
{
/* Are we changing or deleting the volume label? */
if (*szTemp)
{
/* Yup! There is a new one too! So, change the Vol label */
// EDH ChangeVolumeLabel cannot change label to an existing dir/file name,
// since it uses the DOS Rename to do the work. (I consider this a bug
// in DOS' Rename func.) Anyway, use delete/create to change label
// instead. 13 Oct 91
// iRet = ChangeVolumeLabel(nDrive, szTemp);
iRet = DeleteVolumeLabel(nDrive);
iRet = CreateVolumeLabel(nDrive, szTemp);
}
else
{
/* User wants to remove the Vol label. Remove it */
iRet = DeleteVolumeLabel(nDrive);
}
}
else
{
/* We are creating a new label. */
if (*szTemp)
iRet = CreateVolumeLabel(nDrive, szTemp);
}
return(iRet);
}