[OpenAFS-devel] fixes for AFS win client

Andrei Keis Andrei.Keis@morganstanley.com
Wed, 23 Oct 2002 15:26:19 -0400


This is a multi-part message in MIME format.
--------------63FB464FC96D1DEF7F2C59F6
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Dear openafs-devel,

I have a number of patches for AFS Windows client (diff -r -u attached).

Main items are:
    - vc7 support
    - fixed timestamp problem - when moving file on afs drive the new file has
timstamp 1969
    - spaces in afsdcell.ini after server names caused problems - fixed

Here is brief explanation of the changes:

- vc7 support

+++ config/ntmakefile.i386_nt40

    - makefiles derive %INCLUDE% and %LIB% directories from location of vc6
installation. This is done in ntbuild.bat and shoud be modified by a user before
a build. In vc7 directory structure changed. Any vs installation has a batch
file - vcvars32.bat - that is used to prepare build envionment correctly. This
batch file sets PATH, INCLUDE and LIB env variabls correctly. So, instead of
hardcoding them in ntbuild.bat instructions should say:
            - open command prompt
                > vcvars32.bat
                > ntbuild.bat
                > nmake /f NTMakefile install

    -  debug information - always use /Zi switch (it will generate debug
information ni pdb files that are separate from exe/dll's). The advantage is not
only reduced size of the final excutables, but more important - it is possible
to have debug information for release fully optimized binaries without no
performance impact.

!IF ("$(AFSDEV_BUILDTYPE)" == "FREE")
afscflags = $(afscflags) /Ox /Zi
ldebug = $(ldebug)
cdebug = $(cdebug:-Od=)  # avoid annoying override warning (D4025)

# this line is very important - it will select correct runtime libraries for
free build!!!
cvarsdll = $(cvarsdll:-MDd=-MD)-

        link flags to generate debug info and show libraries search path

afslflags =\
 /FIXED:NO /VERBOSE:LIB /DEBUG

The same should be applied in 95 config file (I did not do it, because I do not
have 95 build environment (and I will try to avoid it as much as possible)).

+++
    winnt/afsapplib/ntmakefile
    winnt/client_config/ntmakefile

removed -WX switch to make compiler warning fatal (why are they fatal for these
two modules?)

+++
    winnt/client_exp\ntmakefile
        replace MFCLINK with CONLINK. It is not using MFC nowhere...

+++
    winnt/eventlog/lang/ntmakefile
        replace CONLINK with RESLINK (since it is a resource only dll and does
not have an entry point).

+++
    some minor changes in c/cpp files when vc7 complained - see diff.

------------------------

    -    Timestamp
        in smb_ReceiveTran2SetFileInfo (smb3.c) check for -1

if (LargeIntegerNotEqualToZero(*((LARGE_INTEGER *)&lastMod)) &&
lastMod.dwLowDateTime != -1 && lastMod.dwHighDateTime != -1) {
...
}

-----------------------

winnt/afsd/cm_config.c
    strip spaces after server name when parsing afsdcell.ini

-----------------------

installation

One important thing is to put all binaries in one directory. Since it is
impossible to change environement of scm manager without reboot, if some of the
binaries are in different directories reboot is required to start a service. If
all binaries are in one directory service can start right after installation
finishes. Having bin directory in the PATH is still needed for shell extension,
but it is only one additional entry vs multiple.

In order to generate MSI I do the following

WIndows Installer SDK allows to generate msi without any 3rd party tools that
require license. Solution is based on few vbs script that allow to merge text
tables into target msi.

WiSumInf.vbs - to manage summary info like product / upgrade code
WiImport.vbs - to import text tables into msi
WiRunSQL.vbs - to run direct SQL statements against msi database.

I have a perl script that process insallation directory and some simple xml file
and generates text tables as a result, and then they are merged into template
msi that comes with msi sdk. I cannot provide the perl source code (it is
property of Morgan Stanley) but it should be not difficult ot implement it.
Theoretically there is a way to make it part of open source, but I do not know
what is is involved it this (i would love to...)

I attach the exported msi tables and the msi itself. (also, I am not intereseted
in ui installations, so feature names are not user friendly (REGISTRY, ALLFILES
etc). This can be changed easily.

msi assumes that all binaries (exe, dlls) are in /bin directory under msi script
itself. It is an admin image, so there is no cab file.

That's about it. Please let me know if you have questions.

Thanks,
Andrei.

-----------------

ps I did all changes on 1.2.6, but they are all applicable to 1.2.7 as well -
these files did not change...





--------------63FB464FC96D1DEF7F2C59F6
Content-Type: text/plain; charset=us-ascii;
 name="diff_1.2.6.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="diff_1.2.6.txt"

diff -r -u ./WINNT/afsapplib/NTMakefile e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/afsapplib/NTMakefile
--- ./WINNT/afsapplib/NTMakefile	Wed Oct 23 13:04:59 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/afsapplib/NTMakefile	Sat Nov  4 04:01:18 2000
@@ -5,6 +5,10 @@
 # License.  For details, see the LICENSE file in the top-level source
 # directory or online at http://www.openafs.org/dl/license10.html
 
+# make compiler warnings fatal
+
+AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -WX
+
 # indicate that the functions in this library should be exported
 
 AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -DEXPORT_AFSAPPLIB -DEXPORTED=_declspec(dllexport)
diff -r -u ./WINNT/afsd/afsd_service.c e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/afsd/afsd_service.c
--- ./WINNT/afsd/afsd_service.c	Wed Oct 23 14:27:01 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/afsd/afsd_service.c	Sun Jan 20 03:09:12 2002
@@ -281,7 +281,7 @@
 	return ;
 }
 #else
-void main()
+void _CRTAPI1 main()
 {
 	LONG status = ERROR_SUCCESS;
 	SERVICE_TABLE_ENTRY dispatchTable[] = {
diff -r -u ./WINNT/afsd/afslogon.c e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/afsd/afslogon.c
--- ./WINNT/afsd/afslogon.c	Wed Oct 23 14:27:39 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/afsd/afslogon.c	Sun Jan 20 03:09:12 2002
@@ -11,7 +11,6 @@
 #include <afs/stds.h>
 
 #include <windows.h>
-
 #include <npapi.h>
 #include <winsock2.h>
 #include "afsd.h"
diff -r -u ./WINNT/afsd/cm_config.c e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/afsd/cm_config.c
--- ./WINNT/afsd/cm_config.c	Wed Oct 23 14:28:48 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/afsd/cm_config.c	Wed Nov 14 21:38:48 2001
@@ -242,11 +242,7 @@
 			}
                         valuep++;	/* skip the "#" */
 
-                        valuep += strspn(valuep, " \t"); /* skip SP & TAB */
-                        /* strip spaces and tabs in the end. They should not be there according to CellServDB format
-                        so do this just in case                        */
-                        while (valuep[strlen(valuep) - 1] == ' ' || valuep[strlen(valuep) - 1] == '\t') valuep[strlen(valuep) - 1] = '\0';
-
+                        valuep += strspn(valuep, " 	"); /* skip SP & TAB */
 #endif /* !DJGPP */
 			if (inRightCell) {
 #if !defined(DJGPP) && !defined(AFS_WIN95_ENV)
diff -r -u ./WINNT/afsd/cm_conn.c e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/afsd/cm_conn.c
--- ./WINNT/afsd/cm_conn.c	Thu Oct 10 15:32:20 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/afsd/cm_conn.c	Mon Apr 30 02:48:04 2001
@@ -63,9 +63,9 @@
 	struct cm_req *reqp, cm_serverRef_t **serverspp)
 {
 	long code;
-        cm_volume_t *volp = NULL;
-        cm_serverRef_t *serversp = NULL;
-        cm_cell_t *cellp = NULL;
+        cm_volume_t *volp;
+        cm_serverRef_t *serversp;
+        cm_cell_t *cellp;
 
         if (!fidp) {
 		*serverspp = NULL;
diff -r -u ./WINNT/afsd/cm_vnodeops.c e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/afsd/cm_vnodeops.c
--- ./WINNT/afsd/cm_vnodeops.c	Wed Oct 16 13:18:35 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/afsd/cm_vnodeops.c	Wed Nov 14 21:30:08 2001
@@ -2226,7 +2226,6 @@
 	 * completes.  We do this in vnode order so that we don't deadlock,
 	 * which makes the code a little verbose.
          */
-         
 	if (oldDscp == newDscp) {
                 /* check for identical names */
                 if (strcmp(oldNamep, newNamep) == 0)
@@ -2315,7 +2314,6 @@
                 	&newDirAFSFid, newNamep,
 			&updatedOldDirStatus, &updatedNewDirStatus,
                 	&volSync);
-                	
 	} while (cm_Analyze(connp, userp, reqp, &oldDscp->fid,
 			    &volSync, NULL, code));
         code = cm_MapRPCError(code, reqp);
diff -r -u ./WINNT/afsd/smb3.c e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/afsd/smb3.c
--- ./WINNT/afsd/smb3.c	Wed Oct 23 14:44:06 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/afsd/smb3.c	Fri Jul 26 01:14:26 2002
@@ -1447,18 +1447,13 @@
 
 		/* prepare for setattr call */
 		attr.mask = 0;
-		
 		lastMod = *((FILETIME *)(p->datap + 16));
-		/* when called as result of move a b, lastMod is (-1, -1). If the check for -1 is not present, timestamp
-		of the resulting file will be 1969 (-1)
-		 */
-		if (LargeIntegerNotEqualToZero(*((LARGE_INTEGER *)&lastMod)) && lastMod.dwLowDateTime != -1 && lastMod.dwHighDateTime != -1) {
+		if (LargeIntegerNotEqualToZero(*((LARGE_INTEGER *)&lastMod))) {
 			attr.mask |= CM_ATTRMASK_CLIENTMODTIME;
 			smb_UnixTimeFromLargeSearchTime(&attr.clientModTime,
 							&lastMod);
 			fidp->flags |= SMB_FID_MTIMESETDONE;
 		}
-		
 		attribute = *((u_long *)(p->datap + 32));
 		if (attribute != 0) {
 			if ((scp->unixModeBits & 0222)
diff -r -u ./WINNT/client_config/NTMakefile e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/client_config/NTMakefile
--- ./WINNT/client_config/NTMakefile	Wed Oct 23 13:05:29 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/client_config/NTMakefile	Mon Apr 30 02:48:36 2001
@@ -5,6 +5,10 @@
 # License.  For details, see the LICENSE file in the top-level source
 # directory or online at http://www.openafs.org/dl/license10.html
 
+# make compiler warnings fatal
+
+AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -WX
+
 # include the AFSD source tree on our inclusion path
 
 AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -I ..\afsd
diff -r -u ./WINNT/client_creds/shortcut.cpp e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/client_creds/shortcut.cpp
--- ./WINNT/client_creds/shortcut.cpp	Wed Oct 23 14:43:40 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/client_creds/shortcut.cpp	Sat Nov  4 04:02:48 2000
@@ -18,8 +18,6 @@
 #include <windowsx.h>
 #include <shlobj.h>
 #include <shellapi.h>
-#include <shobjidl.h>
-#include <shlguid.h>
 #include "shortcut.h"
diff -r -u ./WINNT/client_exp/NTMakefile e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/client_exp/NTMakefile
--- ./WINNT/client_exp/NTMakefile	Thu Sep 26 15:54:17 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/client_exp/NTMakefile	Mon Apr 30 02:49:16 2001
@@ -57,7 +57,7 @@
 	$(DESTDIR)\lib\afs\TaLocale.lib
 
 $(DLLFILE): $(DLLOBJS)
-	$(DLLCONLINK) /def:afs_shl_ext.def $(DLLLIBS)
+	$(DLLMFCLINK) /def:afs_shl_ext.def $(DLLLIBS)
 	$(DLLPREP)
 
 ############################################################################
diff -r -u ./WINNT/eventlog/lang/NTMakefile e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/eventlog/lang/NTMakefile
--- ./WINNT/eventlog/lang/NTMakefile	Thu Sep 26 15:28:01 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/WINNT/eventlog/lang/NTMakefile	Mon Apr 30 02:50:16 2001
@@ -40,7 +40,7 @@
 DLLOBJS = $(DLLRESFILE)
 
 $(DLLFILE): $(DLLOBJS)
-	$(DLLRESLINK)
+	$(DLLCONLINK)
 	$(DLLPREP)
 
 ############################################################################
diff -r -u ./config/NTMakefile.i386_nt40 e:\openafs\1.2.6_original\openafs-1.2.6\src/config/NTMakefile.i386_nt40
--- ./config/NTMakefile.i386_nt40	Wed Oct 23 12:59:47 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/config/NTMakefile.i386_nt40	Sun Jan 20 03:09:16 2002
@@ -11,6 +11,7 @@
 #     AFSDEV_BUILDTYPE = [ CHECKED | FREE ]
 #     AFSDEV_INCLUDE = <default include directories>
 #     AFSDEV_LIB = <default library directories>
+#     AFSDEV_BIN = <default build binary directories>
 #
 # Optional definitions:
 #     AFSDEV_DESTDIR = <top-level install directory>  (default is $(AFSROOT)\DEST)
@@ -36,7 +37,7 @@
 !ENDIF
 
 #define used in WinNT/2000 installation and program version display
-AFSPRODUCT_VERSION=1.2.6 a
+AFSPRODUCT_VERSION=1.2.2 b
 CELLNAME_DEFAULT=Your Cell Name
 CELLSERVDB_INSTALL=CellServDB.GrandCentral
 CELLSERVDB_WEB=http://grand.central.org/dl/cellservdb/CellServDB
@@ -62,26 +63,40 @@
 
 # Limit default include and library directories to those specified for build.
 
-#!IFNDEF AFSDEV_INCLUDE
-#!ERROR Must define AFSDEV_INCLUDE to be the default include directories.
-#!ENDIF
+!IFNDEF AFSDEV_INCLUDE
+!ERROR Must define AFSDEV_INCLUDE to be the default include directories.
+!ENDIF
 
-#!IF ((!DEFINED(INCLUDE)) && ([set INCLUDE=$(AFSDEV_INCLUDE)] != 0))
+!IF ((!DEFINED(INCLUDE)) && ([set INCLUDE=$(AFSDEV_INCLUDE)] != 0))
 #    If env. var. INCLUDE not defined then macro assignment won't set it.
-#!ERROR Failed setting environment variable INCLUDE.
-#!ENDIF
-#INCLUDE = $(AFSDEV_INCLUDE)
+!ERROR Failed setting environment variable INCLUDE.
+!ENDIF
+INCLUDE = $(AFSDEV_INCLUDE)
 
 
-#!IFNDEF AFSDEV_LIB
-#!ERROR Must define AFSDEV_LIB to be the default library directories.
-#!ENDIF
+!IFNDEF AFSDEV_LIB
+!ERROR Must define AFSDEV_LIB to be the default library directories.
+!ENDIF
 
-#!IF ((!DEFINED(LIB)) && ([set LIB=$(AFSDEV_LIB)] != 0))
+!IF ((!DEFINED(LIB)) && ([set LIB=$(AFSDEV_LIB)] != 0))
 #    If env. var. LIB not defined then macro assignment won't set it.
-#!ERROR Failed setting environment variable LIB.
-#!ENDIF
-#LIB = $(AFSDEV_LIB)
+!ERROR Failed setting environment variable LIB.
+!ENDIF
+LIB = $(AFSDEV_LIB)
+
+
+# Put default build binary directories at front of path.
+
+!IFNDEF AFSDEV_BIN
+!ERROR Must define AFSDEV_BIN to be the default build binary directories.
+!ENDIF
+
+!IF ((!DEFINED(PATH)) && ([set PATH=$(AFSDEV_BIN)] != 0))
+#    If env. var. PATH not defined then macro assignment won't set it.
+!ERROR Failed setting environment variable PATH.
+!ENDIF
+PATH = $(AFSDEV_BIN);$(PATH)
+
 
 # Undefine WIN32.MAK NODEBUG macro.
 # Always generate full debug info, unless profiling or tuning (see below).
@@ -89,9 +104,11 @@
 !UNDEF NODEBUG
 
 # Include WIN32.MAK nmake file
+
 !INCLUDE <WIN32.MAK>
 
 
+
 # Extend and/or supplement definitions in WIN32.MAK.
 
 # Standard install directory.
@@ -166,15 +183,13 @@
 
 !IF ("$(AFSDEV_BUILDTYPE)" == "FREE")
 #    Apply full optimization; generate full debug info in obj.
-afscflags = $(afscflags) /Ox /Zi
-# ldebug = $(ldebug) -debugtype:both
-ldebug = $(ldebug)
+afscflags = $(afscflags) /Ox /Z7
+ldebug = $(ldebug) -debugtype:both
 cdebug = $(cdebug:-Od=)  # avoid annoying override warning (D4025)
-cvarsdll = $(cvarsdll:-MDd=-MD)
 
 !ELSEIF ("$(AFSDEV_BUILDTYPE)" == "CHECKED")
 #    Disable optimization; generate full debug info in obj.
-afscflags = $(afscflags) /Od /Zi
+afscflags = $(afscflags) /Od /Z7
 ldebug = $(ldebug) -debugtype:both
 !ENDIF
 
@@ -200,14 +215,14 @@
 # /FIXED:NO   generates a relocation section in the executable
 
 afslflags =\
-	/FIXED:NO /VERBOSE:LIB /DEBUG
+	/FIXED:NO
 
 
 
 # For checked builds, define DEBUG (but not the MS control flag _DEBUG).
 
 !IF ("$(AFSDEV_BUILDTYPE)" == "CHECKED")
-#afscdefs = $(afscdefs) -DDEBUG
+afscdefs = $(afscdefs) -DDEBUG
 !ENDIF
 
 # Utilize the debug version of the MSVC runtime, if requested.
diff -r -u ./config/NTMakefile.i386_win95 e:\openafs\1.2.6_original\openafs-1.2.6\src/config/NTMakefile.i386_win95
--- ./config/NTMakefile.i386_win95	Wed Oct 23 12:57:31 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/config/NTMakefile.i386_win95	Sun Jan 20 03:09:16 2002
@@ -11,6 +11,7 @@
 #     AFSDEV_BUILDTYPE = [ CHECKED | FREE ]
 #     AFSDEV_INCLUDE = <default include directories>
 #     AFSDEV_LIB = <default library directories>
+#     AFSDEV_BIN = <default build binary directories>
 #
 # Optional definitions:
 #     AFSDEV_DESTDIR = <top-level install directory>  (default is $(AFSROOT)\DEST)
@@ -93,6 +94,20 @@
 !ENDIF
 LIB = $(AFSDEV_LIB)
 
+
+# Put default build binary directories at front of path.
+
+!IFNDEF AFSDEV_BIN
+!ERROR Must define AFSDEV_BIN to be the default build binary directories.
+!ENDIF
+
+!IF ((!DEFINED(PATH)) && ([set PATH=$(AFSDEV_BIN)] != 0))
+#    If env. var. PATH not defined then macro assignment won't set it.
+!ERROR Failed setting environment variable PATH.
+!ENDIF
+PATH = $(AFSDEV_BIN);$(PATH)
+
+
 # Undefine WIN32.MAK NODEBUG macro.
 # Always generate full debug info, unless profiling or tuning (see below).
 
@@ -287,8 +302,7 @@
 DLLMFCLINK = $(link) /OUT:$@ $(ldebug) $(mfcdlllflags) $(afslflags) $(mfclibsdll) $**
 
 # DLL link macro for resource-only DLLs
-# DLLRESLINK = $(link) /OUT:$@ $(dlllflags:-entry:_DllMainCRTStartup@12=-noentry) $(afslflags) $**
-DLLRESLINK = $(link) /OUT:$@ -noentry $(afslflags) $**
+DLLRESLINK = $(link) /OUT:$@ $(dlllflags:-entry:_DllMainCRTStartup@12=-noentry) $(afslflags) $**
 
 # Library archive macro
 LIBARCH = $(implib) /NOLOGO /OUT:$@ $**
diff -r -u ./ntbuild.bat e:\openafs\1.2.6_original\openafs-1.2.6\src/ntbuild.bat
--- ./ntbuild.bat	Thu Sep 26 14:08:36 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/ntbuild.bat	Wed Oct 23 13:01:17 2002
@@ -53,14 +53,12 @@
 set AFSBLD_IS_WSPP=1
 goto args_done
 
-
 :args_done
 REM ########################################################################
 REM General required definitions:
 REM     SYS_NAME = AFS system name
 
 SET SYS_NAME=i386_win95
-SET SYS_NAME=i386_nt40
 SET _WIN32_IE=0x400
 
 REM ########################################################################
@@ -68,23 +66,16 @@
 REM     AFSDEV_BUILDTYPE = CHECKED / FREE 
 REM     AFSDEV_INCLUDE = default include directories
 REM     AFSDEV_LIB = default library directories
-REM     AFSDEV_BIN = default build binary directories
 
 set AFSDEV_BUILDTYPE=%AFSBLD_TYPE%
-
-rem Location of VC++ development folder
-rem set MSVCDIR=c:\progra~1\micros~2\vc98
-set MSVCDIR="E:\Program Files\Microsoft Visual Studio .NET\Vc7"
-
-set AFSDEV_INCLUDE=%MSVCDIR%\include;%MSVCDIR%\mfc\include
-set AFSDEV_LIB=%MSVCDIR%\lib;%MSVCDIR%\mfc\lib
-set AFSDEV_BIN=%MSVCDIR%\bin
+set AFSDEV_INCLUDE=%INCLUDE%
+set AFSDEV_LIB=%LIB%
 
 REM ########################################################################
 REM Location of base folder where source lies, build directory
 REM e.g. AFSROOT\SRC is source directory of the build tree
 
-set AFSROOT=E:\openafs\openafs-1.2.6
+set AFSROOT=D:\Dev\AfsSorce\OpenAF~2.2
 
 REM ########################################################################
 REM NTMakefile optional definitions:
diff -r -u ./util/readdir_nt.c e:\openafs\1.2.6_original\openafs-1.2.6\src/util/readdir_nt.c
--- ./util/readdir_nt.c	Wed Oct 23 14:26:03 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src/util/readdir_nt.c	Thu Jul 12 15:59:24 2001
@@ -32,7 +32,7 @@
 /* opendir() - The case insensitive version of opendir */
 DIR *opendir(const char *path)
 {
-    DIR *tDir;
+    struct DIR *tDir;
     HANDLE tH;
     char tPath[MAX_PATH];
     WIN32_FIND_DATA tData;


--------------63FB464FC96D1DEF7F2C59F6--