Home | History | Annotate | Download | only in pocdll
      1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef SANDBOX_SANDBOX_POC_POCDLL_UTILS_H__
      6 #define SANDBOX_SANDBOX_POC_POCDLL_UTILS_H__
      7 
      8 #include <stdio.h>
      9 #include <io.h>
     10 
     11 #include "base/macros.h"
     12 
     13 // Class to convert a HANDLE to a FILE *. The FILE * is closed when the
     14 // object goes out of scope
     15 class HandleToFile {
     16  public:
     17   HandleToFile() {
     18     file_ = NULL;
     19   };
     20 
     21   // Note: c_file_handle_ does not need to be closed because fclose does it.
     22   ~HandleToFile() {
     23     if (file_) {
     24       fflush(file_);
     25       fclose(file_);
     26     }
     27   };
     28 
     29   // Translates a HANDLE (handle) to a FILE * opened with the mode "mode".
     30   // The return value is the FILE * or NULL if there is an error.
     31   FILE* Translate(HANDLE handle, const char *mode) {
     32     if (file_) {
     33       return  NULL;
     34     }
     35 
     36     HANDLE new_handle;
     37     BOOL result = ::DuplicateHandle(::GetCurrentProcess(),
     38                                     handle,
     39                                     ::GetCurrentProcess(),
     40                                     &new_handle,
     41                                     0,  // Don't ask for a specific
     42                                         // desired access.
     43                                     FALSE,  // Not inheritable.
     44                                     DUPLICATE_SAME_ACCESS);
     45 
     46     if (!result) {
     47       return NULL;
     48     }
     49 
     50     int c_file_handle = _open_osfhandle(reinterpret_cast<LONG_PTR>(new_handle),
     51                                         0);  // No flags
     52     if (-1 == c_file_handle) {
     53       return NULL;
     54     }
     55 
     56     file_ = _fdopen(c_file_handle, mode);
     57     return file_;
     58   };
     59  private:
     60   // the FILE* returned. We need to closed it at the end.
     61   FILE* file_;
     62 
     63   DISALLOW_COPY_AND_ASSIGN(HandleToFile);
     64 };
     65 
     66 #endif  // SANDBOX_SANDBOX_POC_POCDLL_UTILS_H__
     67