/* * Win32 kernel functions * * Copyright 1995 Martin von Loewis, Sven Verdoolaege, and Cameron Heide */ #include #include #include #include #include #include #include #include #include #include #include "windows.h" #include "winbase.h" #include "winerror.h" #include "file.h" #include "heap.h" #include "handle32.h" #include "xmalloc.h" #include "stddebug.h" #define DEBUG_WIN32 #include "debug.h" DWORD ErrnoToLastError(int errno_num); static int TranslateCreationFlags(DWORD create_flags); static int TranslateAccessFlags(DWORD access_flags); /*********************************************************************** * WriteFile (KERNEL32.578) */ BOOL32 WriteFile(HFILE32 hFile, LPVOID lpBuffer, DWORD numberOfBytesToWrite, LPDWORD numberOfBytesWritten, LPOVERLAPPED lpOverlapped) { LONG res; res = _lwrite32(hFile,lpBuffer,numberOfBytesToWrite); if (res==-1) { SetLastError(ErrnoToLastError(errno)); return FALSE; } if(numberOfBytesWritten) *numberOfBytesWritten = res; return TRUE; } /*********************************************************************** * ReadFile (KERNEL32.428) */ BOOL32 ReadFile(HFILE32 hFile, LPVOID lpBuffer, DWORD numtoread, LPDWORD numread, LPOVERLAPPED lpOverlapped) { int actual_read; actual_read = _lread32(hFile,lpBuffer,numtoread); if(actual_read == -1) { SetLastError(ErrnoToLastError(errno)); return FALSE; } if(numread) *numread = actual_read; return TRUE; } /************************************************************************* * CreateFile32A (KERNEL32.45) * * Doesn't support character devices, pipes, template files, or a * lot of the 'attributes' flags yet. */ HFILE32 CreateFile32A(LPCSTR filename, DWORD access, DWORD sharing, LPSECURITY_ATTRIBUTES security, DWORD creation, DWORD attributes, HANDLE32 template) { int access_flags, create_flags; /* Translate the various flags to Unix-style. */ access_flags = TranslateAccessFlags(access); create_flags = TranslateCreationFlags(creation); if(template) dprintf_file(stddeb, "CreateFile: template handles not supported.\n"); /* If the name starts with '\\?' or '\\.', ignore the first 3 chars. */ if(!strncmp(filename, "\\\\?", 3) || !strncmp(filename, "\\\\.", 3)) filename += 3; /* If the name still starts with '\\', it's a UNC name. */ if(!strncmp(filename, "\\\\", 2)) { dprintf_file(stddeb, "CreateFile: UNC names not supported.\n"); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return HFILE_ERROR32; } /* If the name is either CONIN$ or CONOUT$, give them stdin * or stdout, respectively. */ if(!strcmp(filename, "CONIN$")) return GetStdHandle( STD_INPUT_HANDLE ); if(!strcmp(filename, "CONOUT$")) return GetStdHandle( STD_OUTPUT_HANDLE ); return FILE_Open( filename, access_flags | create_flags ); } /************************************************************************* * CreateFile32W (KERNEL32.48) */ HFILE32 CreateFile32W(LPCWSTR filename, DWORD access, DWORD sharing, LPSECURITY_ATTRIBUTES security, DWORD creation, DWORD attributes, HANDLE32 template) { LPSTR afn = HEAP_strdupWtoA( GetProcessHeap(), 0, filename ); HFILE32 res = CreateFile32A( afn, access, sharing, security, creation, attributes, template ); HeapFree( GetProcessHeap(), 0, afn ); return res; } static int TranslateAccessFlags(DWORD access_flags) { int rc = 0; switch(access_flags) { case GENERIC_READ: rc = O_RDONLY; break; case GENERIC_WRITE: rc = O_WRONLY; break; case (GENERIC_READ | GENERIC_WRITE): rc = O_RDWR; break; } return rc; } static int TranslateCreationFlags(DWORD create_flags) { int rc = 0; switch(create_flags) { case CREATE_NEW: rc = O_CREAT | O_EXCL; break; case CREATE_ALWAYS: rc = O_CREAT | O_TRUNC; break; case OPEN_EXISTING: rc = 0; break; case OPEN_ALWAYS: rc = O_CREAT; break; case TRUNCATE_EXISTING: rc = O_TRUNC; break; } return rc; } /************************************************************************** * SetFileAttributes16 (KERNEL.421) */ BOOL16 SetFileAttributes16( LPCSTR lpFileName, DWORD attributes ) { return SetFileAttributes32A( lpFileName, attributes ); } /************************************************************************** * SetFileAttributes32A (KERNEL32.490) */ BOOL32 SetFileAttributes32A(LPCSTR lpFileName, DWORD attributes) { struct stat buf; DOS_FULL_NAME full_name; if (!DOSFS_GetFullName( lpFileName, TRUE, &full_name )) return FALSE; dprintf_file(stddeb,"SetFileAttributes(%s,%lx)\n",lpFileName,attributes); if(stat(full_name.long_name,&buf)==-1) { SetLastError(ErrnoToLastError(errno)); return FALSE; } if (attributes & FILE_ATTRIBUTE_READONLY) { buf.st_mode &= ~0222; /* octal!, clear write permission bits */ attributes &= ~FILE_ATTRIBUTE_READONLY; } attributes &= ~(FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM); if (attributes) fprintf(stdnimp,"SetFileAttributesA(%s):%lx attribute(s) not implemented.\n",lpFileName,attributes); if (-1==chmod(full_name.long_name,buf.st_mode)) { SetLastError(ErrnoToLastError(errno)); return FALSE; } return TRUE; } /************************************************************************** * SetFileAttributes32W (KERNEL32.491) */ BOOL32 SetFileAttributes32W(LPCWSTR lpFileName, DWORD attributes) { LPSTR afn = HEAP_strdupWtoA( GetProcessHeap(), 0, lpFileName ); BOOL32 res = SetFileAttributes32A( afn, attributes ); HeapFree( GetProcessHeap(), 0, afn ); return res; } VOID SetFileApisToOEM() { fprintf(stdnimp,"SetFileApisToOEM(),stub!\n"); } VOID SetFileApisToANSI() { fprintf(stdnimp,"SetFileApisToANSI(),stub!\n"); } BOOL32 AreFileApisANSI() { fprintf(stdnimp,"AreFileApisANSI(),stub!\n"); return TRUE; } BOOL32 LockFile( HFILE32 hFile,DWORD dwFileOffsetLow,DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToLockLow,DWORD nNumberOfBytesToLockHigh ) { fprintf(stdnimp,"LockFile(%d,0x%08lx%08lx,0x%08lx%08lx),stub!\n", hFile,dwFileOffsetHigh,dwFileOffsetLow, nNumberOfBytesToLockHigh,nNumberOfBytesToLockLow ); return TRUE; } BOOL32 UnlockFile( HFILE32 hFile,DWORD dwFileOffsetLow,DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToUnlockLow,DWORD nNumberOfBytesToUnlockHigh ) { fprintf(stdnimp,"UnlockFile(%d,0x%08lx%08lx,0x%08lx%08lx),stub!\n", hFile,dwFileOffsetHigh,dwFileOffsetLow, nNumberOfBytesToUnlockHigh,nNumberOfBytesToUnlockLow ); return TRUE; }