Skip to content
Permalink
Browse files
-Added optional DISABLE_NT_SUPPORT to not compile NT specific code
-Not NT systems set C:\ as the profile directory.  This should be changed to
 the basedir most likely...
-Defined INVALID_SET_FILE_POINTER for systems that don't have the latest
 platform SDK.  According to MSDN doc, this should be okay.
  • Loading branch information
readgs committed May 6, 2002
1 parent b575e7c commit c06e3ca30be21838d224baef4aca30de1ed90de5
Showing with 76 additions and 69 deletions.
  1. +76 −69 platform/win32.c
@@ -7,11 +7,14 @@
*/

#include <windows.h>
#include <userenv.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#ifndef DISABLE_NT_SUPPORT
#include <userenv.h>
#endif

#define __PHYSICSFS_INTERNAL__
#include "physfs_internal.h"

@@ -25,10 +28,15 @@ static HANDLE AccessTokenHandle = NULL; /* Security handle to process */
static DWORD ProcessID; /* ID assigned to current process */
static int runningNT; /* TRUE if NT derived OS */
static OSVERSIONINFO OSVersionInfo; /* Information about the OS */

/* NT specific information */
static char *ProfileDirectory = NULL; /* User profile folder */

/* Users without the platform SDK don't have this defined. The original docs
for SetFilePointer() just said to compare with 0xFFFFFFF, so this should
work as desired */
#ifndef INVALID_SET_FILE_POINTER
#define INVALID_SET_FILE_POINTER 0xFFFFFFFF
#endif

static const char *win32strerror(void)
{
static TCHAR msgbuf[255];
@@ -143,18 +151,7 @@ char *__PHYSFS_platformGetUserName(void)

char *__PHYSFS_platformGetUserDir(void)
{
char *userdir = NULL;

if (runningNT)
{
userdir = ProfileDirectory;
}
else
{
/*!!!TODO - Need to return something for Win9x/ME */
}

return userdir;
return ProfileDirectory;
} /* __PHYSFS_platformGetUserDir */


@@ -435,42 +432,6 @@ int __PHYSFS_platformMkDir(const char *path)
return(1);
} /* __PHYSFS_platformMkDir */

/*
* Initialize any NT specific stuff. This includes any OS based on NT.
*
* Return zero if there was a catastrophic failure and non-zero otherwise.
*/
static int doNTInit(void)
{
DWORD pathsize = 0;
char TempProfileDirectory[1];

/* Create a process access token handle */
if(!OpenProcessToken(ProcessHandle, TOKEN_QUERY, &AccessTokenHandle))
{
/* Access token is required by other win32 functions */
return 0;
}

/* Should fail. Will write the size of the profile path in pathsize*/
/*!!! Second parameter can't be NULL or the function fails??? */
if(!GetUserProfileDirectory(AccessTokenHandle, TempProfileDirectory, &pathsize))
{
/* Allocate memory for the profile directory */
ProfileDirectory = (char *)malloc(pathsize);
BAIL_IF_MACRO(ProfileDirectory == NULL, ERR_OUT_OF_MEMORY, 0);
/* Try to get the profile directory */
if(!GetUserProfileDirectory(AccessTokenHandle, ProfileDirectory, &pathsize))
{
free(ProfileDirectory);
return 0;
}
}

/* Everything initialized okay */
return 1;
}

/*
* Get OS info and save it.
*
@@ -510,6 +471,11 @@ int __PHYSFS_platformInit(void)
return 0;
}

/* TODO - Probably want to change this to something like the basedir */
/* Default profile directory */
ProfileDirectory = "C:\\";

#ifndef DISABLE_NT_SUPPORT
/* If running an NT system (NT/Win2k/XP, etc...) */
if(runningNT)
{
@@ -519,33 +485,18 @@ int __PHYSFS_platformInit(void)
return 0;
}
}

/* It's all good */
return 1;
}

/*
* Uninitialize any NT specific stuff done in doNTInit().
*
* Return zero if there was a catastrophic failure and non-zero otherwise.
*/
static int doNTDeinit(void)
{
if(CloseHandle(AccessTokenHandle) != S_OK)
{
return 0;
}

free(ProfileDirectory);
#endif

/* It's all good */
return 1;
}

int __PHYSFS_platformDeinit(void)
{
#ifndef DISABLE_NT_SUPPORT
if(!doNTDeinit())
return 0;
#endif

if(CloseHandle(ProcessHandle) != S_OK)
return 0;
@@ -875,5 +826,61 @@ void __PHYSFS_platformReleaseMutex(void *mutex)
ReleaseMutex((HANDLE)mutex);
}

/* NT specific functions go in here so they don't get compiled when not NT */
#ifndef DISABLE_NT_SUPPORT
/*
* Uninitialize any NT specific stuff done in doNTInit().
*
* Return zero if there was a catastrophic failure and non-zero otherwise.
*/
static int doNTDeinit(void)
{
if(CloseHandle(AccessTokenHandle) != S_OK)
{
return 0;
}

free(ProfileDirectory);

/* It's all good */
return 1;
}

/*
* Initialize any NT specific stuff. This includes any OS based on NT.
*
* Return zero if there was a catastrophic failure and non-zero otherwise.
*/
static int doNTInit(void)
{
DWORD pathsize = 0;
char TempProfileDirectory[1];

/* Create a process access token handle */
if(!OpenProcessToken(ProcessHandle, TOKEN_QUERY, &AccessTokenHandle))
{
/* Access token is required by other win32 functions */
return 0;
}

/* Should fail. Will write the size of the profile path in pathsize*/
/*!!! Second parameter can't be NULL or the function fails??? */
if(!GetUserProfileDirectory(AccessTokenHandle, TempProfileDirectory, &pathsize))
{
/* Allocate memory for the profile directory */
ProfileDirectory = (char *)malloc(pathsize);
BAIL_IF_MACRO(ProfileDirectory == NULL, ERR_OUT_OF_MEMORY, 0);
/* Try to get the profile directory */
if(!GetUserProfileDirectory(AccessTokenHandle, ProfileDirectory, &pathsize))
{
free(ProfileDirectory);
return 0;
}
}

/* Everything initialized okay */
return 1;
}
#endif
/* end of win32.c ... */

0 comments on commit c06e3ca

Please sign in to comment.