⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stdio.c

📁 uboot在arm处理器s3c2410的移植代码
💻 C
字号:
/******************************************************************************                   SciTech OS Portability Manager Library**  ========================================================================**    The contents of this file are subject to the SciTech MGL Public*    License Version 1.0 (the "License"); you may not use this file*    except in compliance with the License. You may obtain a copy of*    the License at http://www.scitechsoft.com/mgl-license.txt**    Software distributed under the License is distributed on an*    "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or*    implied. See the License for the specific language governing*    rights and limitations under the License.**    The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.**    The Initial Developer of the Original Code is SciTech Software, Inc.*    All Rights Reserved.**  ========================================================================** Language:     ANSI C* Environment:  32-bit Windows NT driver** Description:  C library compatible I/O functions for use within a Windows*               NT driver.*****************************************************************************/#include "pmapi.h"#include "oshdr.h"/*------------------------ Main Code Implementation -----------------------*//****************************************************************************REMARKS:NT driver implementation of the ANSI C fopen function.****************************************************************************/FILE * fopen(    const char *filename,    const char *mode){    ACCESS_MASK                 DesiredAccess;      /* for ZwCreateFile... */    OBJECT_ATTRIBUTES           ObjectAttributes;    ULONG                       ShareAccess;    ULONG                       CreateDisposition;    NTSTATUS                    status;    HANDLE                      FileHandle;    UNICODE_STRING              *uniFile = NULL;    PWCHAR                      bufFile = NULL;    IO_STATUS_BLOCK             IoStatusBlock;    FILE_STANDARD_INFORMATION   FileInformation;    FILE_POSITION_INFORMATION   FilePosition;    char                        kernelFilename[PM_MAX_PATH+5];    FILE                        *f;    /* Add prefix for addressing the file system. "\??\" is short for "\DosDevices\" */    strcpy(kernelFilename, "\\??\\");    strcat(kernelFilename, filename);    if ((f = PM_malloc(sizeof(FILE))) == NULL)	goto Error;    f->offset = 0;    f->text = (mode[1] == 't' || mode[2] == 't');    f->writemode = (mode[0] == 'w') || (mode[0] == 'a');    if (mode[0] == 'r') {	/* omode = OPEN_ACCESS_READONLY | OPEN_SHARE_COMPATIBLE; */	/* action = ACTION_IFEXISTS_OPEN | ACTION_IFNOTEXISTS_FAIL; */	DesiredAccess = GENERIC_READ;	ShareAccess = FILE_SHARE_READ | FILE_SHARE_WRITE;	CreateDisposition = FILE_OPEN;	}    else if (mode[0] == 'w') {	/* omode = OPEN_ACCESS_WRITEONLY | OPEN_SHARE_COMPATIBLE; */	/* action = ACTION_IFEXISTS_TRUNCATE | ACTION_IFNOTEXISTS_CREATE; */	DesiredAccess = GENERIC_WRITE;	ShareAccess = FILE_SHARE_READ | FILE_SHARE_WRITE;	CreateDisposition = FILE_SUPERSEDE;	}    else {	/* omode = OPEN_ACCESS_READWRITE | OPEN_SHARE_COMPATIBLE; */	/* action = ACTION_IFEXISTS_OPEN | ACTION_IFNOTEXISTS_CREATE; */	DesiredAccess = GENERIC_READ | GENERIC_WRITE;	ShareAccess = FILE_SHARE_READ;	CreateDisposition = FILE_OPEN_IF;	}    /* Convert filename string to ansi string and then to UniCode string */    if ((uniFile = _PM_CStringToUnicodeString(kernelFilename)) == NULL)	return NULL;    /* Create the file */    InitializeObjectAttributes (&ObjectAttributes,				uniFile,				OBJ_CASE_INSENSITIVE,				NULL,				NULL);    status = ZwCreateFile( &FileHandle,			    DesiredAccess | SYNCHRONIZE,			    &ObjectAttributes,			    &IoStatusBlock,			    NULL,                   /* AllocationSize  OPTIONAL, */			    FILE_ATTRIBUTE_NORMAL,			    ShareAccess,			    CreateDisposition,			    FILE_RANDOM_ACCESS,     /* CreateOptions, */			    NULL,                   /* EaBuffer  OPTIONAL, */			    0                       /* EaLength (required if EaBuffer) */			    );    if (!NT_SUCCESS (status))	goto Error;    f->handle = (int)FileHandle;    /* Determine size of the file */    status = ZwQueryInformationFile(  FileHandle,				      &IoStatusBlock,				      &FileInformation,				      sizeof(FILE_STANDARD_INFORMATION),				      FileStandardInformation				      );    if (!NT_SUCCESS (status))	goto Error;    f->filesize = FileInformation.EndOfFile.LowPart;    /* Move to the end of the file if we are appending */    if (mode[0] == 'a') {	FilePosition.CurrentByteOffset.HighPart = 0;	FilePosition.CurrentByteOffset.LowPart = f->filesize;	status = ZwSetInformationFile(  FileHandle,					&IoStatusBlock,					&FilePosition,					sizeof(FILE_POSITION_INFORMATION),					FilePositionInformation					);	if (!NT_SUCCESS (status))	    goto Error;	}    return f;Error:    if (f) PM_free(f);    if (uniFile) _PM_FreeUnicodeString(uniFile);    return NULL;}/****************************************************************************REMARKS:NT driver implementation of the ANSI C fread function.****************************************************************************/size_t fread(    void *ptr,    size_t size,    size_t n,    FILE *f){    NTSTATUS        status;    IO_STATUS_BLOCK IoStatusBlock;    LARGE_INTEGER   ByteOffset;    /* Read any extra bytes from the file */    ByteOffset.HighPart = 0;    ByteOffset.LowPart = f->offset;    status = ZwReadFile( (HANDLE)f->handle,			 NULL,              /*IN HANDLE  Event  OPTIONAL, */			 NULL,              /*  IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL, */			 NULL,              /*  IN PVOID  ApcContext  OPTIONAL, */			 &IoStatusBlock,			 ptr,               /*  OUT PVOID  Buffer, */			 size * n,          /*IN ULONG  Length, */			 &ByteOffset,       /*OPTIONAL, */			 NULL               /*IN PULONG  Key  OPTIONAL */			 );    if (!NT_SUCCESS (status))	return 0;    f->offset += IoStatusBlock.Information;    return IoStatusBlock.Information / size;}/****************************************************************************REMARKS:NT driver implementation of the ANSI C fwrite function.****************************************************************************/size_t fwrite(    const void *ptr,    size_t size,    size_t n,    FILE *f){    NTSTATUS        status;    IO_STATUS_BLOCK IoStatusBlock;    LARGE_INTEGER   ByteOffset;    if (!f->writemode)	return 0;    ByteOffset.HighPart = 0;    ByteOffset.LowPart = f->offset;    status = ZwWriteFile( (HANDLE)f->handle,			  NULL,             /*IN HANDLE  Event  OPTIONAL, */			  NULL,             /*  IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL, */			  NULL,             /*  IN PVOID  ApcContext  OPTIONAL, */			  &IoStatusBlock,			  (void*)ptr,       /*  OUT PVOID  Buffer, */			  size * n,         /*IN ULONG  Length, */			  &ByteOffset,      /*OPTIONAL, */			  NULL              /*IN PULONG  Key  OPTIONAL */			  );    if (!NT_SUCCESS (status))	return 0;    f->offset += IoStatusBlock.Information;    if (f->offset > f->filesize)	f->filesize = f->offset;    return IoStatusBlock.Information / size;}/****************************************************************************REMARKS:NT driver implementation of the ANSI C fflush function.****************************************************************************/int fflush(    FILE *f){    /* Nothing to do here as we are not doing buffered I/O */    (void)f;    return 0;}/****************************************************************************REMARKS:NT driver implementation of the ANSI C fseek function.****************************************************************************/int fseek(    FILE *f,    long int offset,    int whence){    NTSTATUS                    status;    FILE_POSITION_INFORMATION   FilePosition;    IO_STATUS_BLOCK             IoStatusBlock;    if (whence == 0)	f->offset = offset;    else if (whence == 1)	f->offset += offset;    else if (whence == 2)	f->offset = f->filesize + offset;    FilePosition.CurrentByteOffset.HighPart = 0;    FilePosition.CurrentByteOffset.LowPart = f->offset;    status = ZwSetInformationFile( (HANDLE)f->handle,				   &IoStatusBlock,				   &FilePosition,				   sizeof(FILE_POSITION_INFORMATION),				   FilePositionInformation				   );    if (!NT_SUCCESS (status))	return -1;    return 0;}/****************************************************************************REMARKS:NT driver implementation of the ANSI C ftell function.****************************************************************************/long ftell(    FILE *f){    return f->offset;}/****************************************************************************REMARKS:NT driver implementation of the ANSI C feof function.****************************************************************************/int feof(    FILE *f){    return (f->offset == f->filesize);}/****************************************************************************REMARKS:NT driver implementation of the ANSI C fgets function.****************************************************************************/char *fgets(    char *s,    int n,    FILE *f){    int     len;    char    *cs;    /* Read the entire buffer into memory (our functions are unbuffered!) */    if ((len = fread(s,1,n,f)) == 0)	return NULL;    /* Search for '\n' or end of string */    if (n > len)	n = len;    cs = s;    while (--n > 0) {	if (*cs == '\n')	    break;	cs++;	}    *cs = '\0';    return s;}/****************************************************************************REMARKS:NT driver implementation of the ANSI C fputs function.****************************************************************************/int fputs(    const char *s,    FILE *f){    return fwrite(s,1,strlen(s),f);}/****************************************************************************REMARKS:NT driver implementation of the ANSI C fclose function.****************************************************************************/int fclose(    FILE *f){    ZwClose((HANDLE)f->handle);    PM_free(f);    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -