windows-nt/Source/XPSP1/NT/sdktools/winobj/wflabel.c
2020-09-26 16:20:57 +08:00

129 lines
4 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) {
/* 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;
*p = TEXT('\0');
break;
}
}
}
/* Create a file with the attribute "VOLUME LABEL" */
if ((fh = CreateVolumeFile(szFullVolName)) == 0)
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);
}