/* * 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 "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 WINAPI 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 WINAPI 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; } /*********************************************************************** * ReadFileEx (KERNEL32.) */ typedef /* from winbase.h */ VOID (WINAPI *LPOVERLAPPED_COMPLETION_ROUTINE)( DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped ); BOOL32 WINAPI ReadFileEx(HFILE32 hFile, LPVOID lpBuffer, DWORD numtoread, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) { fprintf(stdnimp,"ReadFileEx file %d to buf %p num %ld %p func %p stub\n", hFile, lpBuffer, numtoread, lpOverlapped, lpCompletionRoutine); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } /************************************************************************* * CreateFile32A (KERNEL32.45) * * Doesn't support character devices, pipes, template files, or a * lot of the 'attributes' flags yet. */ HFILE32 WINAPI 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 WINAPI 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 WINAPI SetFileAttributes16( LPCSTR lpFileName, DWORD attributes ) { return SetFileAttributes32A( lpFileName, attributes ); } /************************************************************************** * SetFileAttributes32A (KERNEL32.490) */ BOOL32 WINAPI 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 (attributes & FILE_ATTRIBUTE_NORMAL) { attributes &= ~FILE_ATTRIBUTE_NORMAL; if (attributes) fprintf(stdnimp,"SetFileAttributesA(%s):%lx illegal combination with FILE_ATTRIBUTE_NORMAL.\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 WINAPI SetFileAttributes32W(LPCWSTR lpFileName, DWORD attributes) { LPSTR afn = HEAP_strdupWtoA( GetProcessHeap(), 0, lpFileName ); BOOL32 res = SetFileAttributes32A( afn, attributes ); HeapFree( GetProcessHeap(), 0, afn ); return res; } /************************************************************************** * SetFileApisToOEM (KERNEL32.645) */ VOID WINAPI SetFileApisToOEM(void) { /*fprintf(stdnimp,"SetFileApisToOEM(),stub!\n");*/ } /************************************************************************** * SetFileApisToANSI (KERNEL32.644) */ VOID WINAPI SetFileApisToANSI(void) { /*fprintf(stdnimp,"SetFileApisToANSI(),stub!\n");*/ } /************************************************************************** * AreFileApisANSI (KERNEL32.105) */ BOOL32 WINAPI AreFileApisANSI(void) { fprintf(stdnimp,"AreFileApisANSI(),stub!\n"); return TRUE; }