Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

378 lines
10 KiB

#include "windows.h"
#include <port1632.h>
#include "dos.h"
#include "global.h"
#include "parse.h"
#include "stdio.h"
#include "fcntl.h"
#include "sys\types.h"
#include "sys\stat.h"
#include "direct.h"
#include "string.h"
#include "io.h"
#include "errno.h"
//int errno;
CHAR FileName[LEN_EDITBOX];
CHAR PathName[LEN_EDITBOX];
CHAR EditStr[LEN_EDITBOX];
CHAR str[255];
CHAR OpenErr[20] = "Cannot open ";
#ifdef WIN32
WIN32_FIND_DATA FindData;
HANDLE hFind;
#else
struct find_t c_file;
#endif
VOID SeparateFile(HWND, LPSTR, LPSTR, LPSTR);
/****************************************************************************
FUNCTION: SeparateFile(HWND, int, LPSTR, LPSTR)
PURPOSE: determine if filename and path spec point to valid file
****************************************************************************/
INT APIENTRY ParseFileName(hDlg,FLNAME,lpCurPath,lpCurSpec)
HWND hDlg;
INT FLNAME;
LPSTR lpCurPath,lpCurSpec;
{
HFILE hndl;
INT length;
INT location;
OFSTRUCT OpenBuf;
GetDlgItemText(hDlg, FLNAME, EditStr, LEN_EDITBOX);
SeparateFile(hDlg, (LPSTR)PathName, (LPSTR)FileName, (LPSTR)EditStr);
/*****************************************************
Filename is Not Null and does not contain wildcards
possibilities : - a subdirectory was entered (doesn't end in \)
- a filename only was entered
- a combination of path and filename was entered
In each of these cases the EditStr is validated and then either
the listboxes are updated or the file is opened.
******************************************************/
if ((FileName[0]) && !(strchr(FileName, '*') || strchr(FileName, '?'))) {
#ifdef WIN32
if ((hFind = FindFirstFile (EditStr, &FindData)) == (HANDLE) -1)
#else
if (_dos_findfirst(EditStr,_A_NORMAL | _A_SUBDIR, &c_file) != 0)
#endif
{
// special case EditStr ending in ".." or "."
if ((lstrcmp(FileName,"..") == 0) || (lstrcmp(FileName,".") == 0))
{
lstrcpy(FileName,EditStr);
lstrcat(FileName,"\\*.*");
#ifdef WIN32
if ((hFind = FindFirstFile (EditStr, &FindData)) != (HANDLE) -1)
#else
if (_dos_findfirst(FileName,_A_NORMAL | _A_SUBDIR, &c_file) == 0)
#endif
{
DlgDirList(hDlg,EditStr,0,0,0x0000);
#ifdef WIN32
GetCurrentDirectory (LEN_EDITBOX, lpCurPath);
FindClose (hFind);
#else
_getcwd(lpCurPath, LEN_EDITBOX);
#endif
return (VALID_FILESPEC);
}
else
{
return (INVALID_FILESPEC);
}
}
// Added this code to append extension if there wasn't one [NB]
// Added ability to return invalid filename if
// FileName > 12 or extension > 4 characters
if (instr(FileName,".") == NULL)
{
if (lstrlen(FileName) < 9)
{
lstrcat(FileName,DEFAULT_EXT);
lstrcpy(lpCurSpec,FileName);
}
else
{
return (INVALID_FILESPEC);
}
}
else
{
if (lstrlen(FileName) > 12)
{
return (INVALID_FILESPEC);
}
length = lstrlen(FileName);
location = strcspn(FileName,".");
if ((lstrlen(FileName) - strcspn(FileName,".")) > 4)
{
return (INVALID_FILESPEC);
}
lstrcpy(lpCurSpec,FileName);
}
if (hndl = OpenFile (EditStr, &OpenBuf, OF_CREATE) == -1)
{
#ifdef WIN32
GetCurrentDirectory (LEN_EDITBOX, lpCurPath);
#else
_getcwd (lpCurPath, LEN_EDITBOX);
#endif
return (INVALID_FILESPEC);
}
else
{
_lclose (hndl);
MDeleteFile(EditStr);
if (PathName[0] != 0)
{
DlgDirList(hDlg,PathName,0,0,0x0000);
// getcwd(lpCurPath,LEN_EDITBOX);
}
#ifdef WIN32
GetCurrentDirectory (LEN_EDITBOX, lpCurPath);
#else
_getcwd(lpCurPath,LEN_EDITBOX);
#endif
return (VALID_FILENAME);
}
}
else // found the file
{
#ifdef WIN32
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
DlgDirList(hDlg,EditStr,0,0,0x0000);
GetCurrentDirectory (LEN_EDITBOX, lpCurPath);
FindClose (hFind);
return (VALID_FILESPEC);
}
#else
if (c_file.attrib & _A_SUBDIR)
{
DlgDirList(hDlg,EditStr,NULL,NULL,0x0000);
_getcwd(lpCurPath,LEN_EDITBOX);
return (VALID_FILESPEC);
}
#endif
else // not a directory
{
// Added this code to append extension if there wasn't one [NB]
// Added ability to return invalid filename if
// FileName > 12 or extension > 4 characters
if (instr(FileName,".") == NULL)
{
if (lstrlen(FileName) < 9)
{
lstrcat(FileName,DEFAULT_EXT);
lstrcpy(lpCurSpec,FileName);
}
else
{
return (INVALID_FILESPEC);
}
}
else
{
if (lstrlen(FileName) > 12)
{
return (INVALID_FILESPEC);
}
length = lstrlen(FileName);
location = strcspn(FileName,".");
if ((lstrlen(FileName) - strcspn(FileName,".")) > 4)
{
return (INVALID_FILESPEC);
}
lstrcpy(lpCurSpec,FileName);
}
#ifdef WIN32
GetCurrentDirectory (LEN_EDITBOX, lpCurPath);
#else
_getcwd(lpCurPath,LEN_EDITBOX);
#endif
return (EXIST_FILESPEC);
}
}
}
/*****************************************************
Filename is either Null or contains wildcards
possibilities : - only a \ was entered (no filespec)
- only a filespec w/* or ? was entered
- a combination of path and filename was
entered with wildcards
In each of these cases the path is validated and the
current filespec is updated to represent the wildcards.
The listboxes are then updated.
******************************************************/
if (strcmp(PathName,"\\") == 0)
{
DlgDirList(hDlg,PathName,0,0,0x0000);
_getcwd(lpCurPath,LEN_EDITBOX);
if (FileName[0] != 0)
lstrcpy(lpCurSpec,FileName);
return (VALID_FILESPEC);
}
if ((PathName[0] == 0) && (FileName[0] != 0))
{
_getcwd(lpCurPath,LEN_EDITBOX);
lstrcpy(lpCurSpec,FileName);
return (VALID_FILESPEC);
}
if (PathName[0] != 0)
{
lstrcpy(str,PathName);
lstrcat(str,"*.*");
#ifdef WIN32
if ((hFind = FindFirstFile (str, &FindData)) == (HANDLE) -1)
#else
if (_dos_findfirst(str, _A_NORMAL | _A_SUBDIR, &c_file) != 0)
#endif
{
return (INVALID_FILESPEC);
}
else
{
DlgDirList(hDlg,PathName,0,0,0x0000);
#ifdef WIN32
GetCurrentDirectory (LEN_EDITBOX, lpCurPath);
FindClose (hFind);
#else
_getcwd(lpCurPath, LEN_EDITBOX);
#endif
if (FileName[0] != 0)
lstrcpy(lpCurSpec,FileName);
return (VALID_FILESPEC);
}
}
}
/****************************************************************************
FUNCTION: SeparateFile(HWND, LPSTR, LPSTR, LPSTR)
PURPOSE: Separate filename and pathname
****************************************************************************/
VOID SeparateFile(hDlg, lpDestPath, lpDestFileName, lpSrcFileName)
HWND hDlg;
LPSTR lpDestPath, lpDestFileName, lpSrcFileName;
{
LPSTR lpTmp;
CHAR cTmp;
lpTmp = lpSrcFileName + (LONG) lstrlen(lpSrcFileName);
while (*lpTmp != ':' && *lpTmp != '\\' && lpTmp > lpSrcFileName)
lpTmp = AnsiPrev(lpSrcFileName, lpTmp);
if (*lpTmp != ':' && *lpTmp != '\\')
{
lstrcpy(lpDestFileName, lpSrcFileName);
lpDestPath[0] = 0;
return;
}
lstrcpy(lpDestFileName, lpTmp + 1);
cTmp = *(lpTmp + 1);
lstrcpy(lpDestPath, lpSrcFileName);
*(lpTmp + 1) = cTmp;
lpDestPath[(lpTmp - lpSrcFileName) + 1] = 0;
}
/****************************************************************************
FUNCTION: UpdateListBoxes(HWND, int, int, int, int, LPSTR, LPSTR)
PURPOSE: Update dialog list boxes using new path as file spec.
****************************************************************************/
VOID APIENTRY UpdateListBoxes(hDlg,FILELB,DIRLB,DIRNAME,FLNAME,
lpPathSpec, lpCurSpec)
HWND hDlg;
INT FILELB, DIRLB, DIRNAME, FLNAME;
LPSTR lpPathSpec,lpCurSpec;
{
CHAR tempSpec[150];
lstrcpy(tempSpec,lpCurSpec);
if ((strchr(tempSpec, '*') == 0) && (strchr(tempSpec, '?') == 0))
{
/*NAMECHANGE*/
lstrcpy(tempSpec,"*.SCN");
}
else
{
// use lpCurSpec
}
if (DlgDirList(hDlg,lpPathSpec,DIRLB,DIRNAME,0x4000 | 0x0010 | 0x8000) != 0)
{
DlgDirList(hDlg,(LPSTR)tempSpec,FILELB,0,0x0000);
SetDlgItemText(hDlg,FLNAME,lpCurSpec);
SendDlgItemMessage(hDlg,
FLNAME,
EM_SETSEL,
GET_EM_SETSEL_MPS (0, 0x7fff));
SetFocus(GetDlgItem(hDlg, FLNAME));
_getcwd(lpPathSpec,LEN_EDITBOX);
}
}
VOID APIENTRY QualifyFileName(lpCurPath,lpCurSpec,lpQualifiedFile)
LPSTR lpCurPath,lpCurSpec,lpQualifiedFile;
{
if ((lpCurPath[0] != 0) && (lpCurSpec[0] != 0)) {
if (lpCurPath[lstrlen(lpCurPath)-1] != '\\')
lstrcat(lpCurPath,"\\");
lstrcpy(lpQualifiedFile,lpCurPath);
lstrcat(lpQualifiedFile,lpCurSpec);
} else {
lpQualifiedFile[0] = 0;
}
};