VirtualBox

Changeset 2985 in kBuild for trunk/src/lib/nt/ntdir.c


Ignore:
Timestamp:
Nov 1, 2016 6:26:35 PM (9 years ago)
Author:
bird
Message:

lib/nt: Got fts-nt halfways working, quite a few NT interface changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lib/nt/ntdir.c

    r2708 r2985  
    55
    66/*
    7  * Copyright (c) 2005-2013 knut st. osmundsen <bird-kBuild-spamx@anduin.net>
     7 * Copyright (c) 2005-2016 knut st. osmundsen <bird-kBuild-spamx@anduin.net>
    88 *
    99 * Permission is hereby granted, free of charge, to any person obtaining a
     
    3636#include <errno.h>
    3737#include <malloc.h>
     38#include <assert.h>
    3839
    3940#include "ntstuff.h"
     
    4344
    4445/**
     46 * Implements opendir.
     47 */
     48BirdDir_T *birdDirOpen(const char *pszPath)
     49{
     50    HANDLE hDir = birdOpenFile(pszPath,
     51                               FILE_READ_DATA | SYNCHRONIZE,
     52                               FILE_ATTRIBUTE_NORMAL,
     53                               FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
     54                               FILE_OPEN,
     55                               FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT,
     56                               OBJ_CASE_INSENSITIVE);
     57    if (hDir != INVALID_HANDLE_VALUE)
     58    {
     59        BirdDir_T *pDir = birdDirOpenFromHandle((void *)hDir, NULL, BIRDDIR_F_CLOSE_HANDLE);
     60        if (pDir)
     61            return pDir;
     62        birdCloseFile(hDir);
     63    }
     64    return NULL;
     65}
     66
     67
     68/**
     69 * Alternative opendir, with extra stat() info returned by readdir().
     70 */
     71BirdDir_T *birdDirOpenExtraInfo(const char *pszPath)
     72{
     73    HANDLE hDir = birdOpenFile(pszPath,
     74                               FILE_READ_DATA | SYNCHRONIZE,
     75                               FILE_ATTRIBUTE_NORMAL,
     76                               FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
     77                               FILE_OPEN,
     78                               FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT,
     79                               OBJ_CASE_INSENSITIVE);
     80    if (hDir != INVALID_HANDLE_VALUE)
     81    {
     82        BirdDir_T *pDir = birdDirOpenFromHandle((void *)hDir, NULL, BIRDDIR_F_CLOSE_HANDLE | BIRDDIR_F_EXTRA_INFO);
     83        if (pDir)
     84            return pDir;
     85        birdCloseFile(hDir);
     86    }
     87    return NULL;
     88}
     89
     90
     91BirdDir_T *birdDirOpenExW(void *hRoot, const wchar_t *pwszPath, const wchar_t *pwszFilter, unsigned fFlags)
     92{
     93    HANDLE hDir = birdOpenFileExW((HANDLE)hRoot,
     94                                  pwszPath,
     95                                  FILE_READ_DATA | SYNCHRONIZE,
     96                                  FILE_ATTRIBUTE_NORMAL,
     97                                  FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
     98                                  FILE_OPEN,
     99                                  FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT,
     100                                  OBJ_CASE_INSENSITIVE);
     101    if (hDir != INVALID_HANDLE_VALUE)
     102    {
     103        BirdDir_T *pDir = birdDirOpenFromHandle((void *)hDir, pwszFilter, fFlags | BIRDDIR_F_CLOSE_HANDLE);
     104        if (pDir)
     105            return pDir;
     106        birdCloseFile(hDir);
     107    }
     108    return NULL;
     109}
     110
     111
     112/**
    45113 * Internal worker for birdStatModTimeOnly.
    46114 */
    47 static BirdDir_T *birdDirOpenInternal(const char *pszPath, const char *pszFilter, int fMinimalInfo)
    48 {
    49     HANDLE hFile = birdOpenFile(pszPath,
    50                                 FILE_READ_DATA | SYNCHRONIZE,
    51                                 FILE_ATTRIBUTE_NORMAL,
    52                                 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
    53                                 FILE_OPEN,
    54                                 FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT,
    55                                 OBJ_CASE_INSENSITIVE);
    56     if (hFile != INVALID_HANDLE_VALUE)
     115BirdDir_T *birdDirOpenFromHandle(void *pvHandle, const void *pvReserved, unsigned fFlags)
     116{
     117    if (!pvReserved)
    57118    {
    58119        /*
    59          * Allocate a handle.
     120         * Allocate and initialize the directory enum handle.
    60121         */
    61122        BirdDir_T *pDir = (BirdDir_T *)birdMemAlloc(sizeof(*pDir));
    62123        if (pDir)
    63124        {
    64             pDir->uMagic     = BIRD_DIR_MAGIC;
    65             pDir->pvHandle   = (void *)hFile;
    66             pDir->uDev       = 0;
    67             pDir->offPos     = 0;
    68             pDir->fHaveData  = 0;
    69             pDir->fFirst     = 1;
    70             pDir->iInfoClass = fMinimalInfo ? MyFileNamesInformation : MyFileIdFullDirectoryInformation;
    71             pDir->offBuf     = 0;
    72             pDir->cbBuf      = 0;
    73             pDir->pabBuf     = NULL;
     125            pDir->uMagic        = BIRD_DIR_MAGIC;
     126            pDir->fFlags        = fFlags;
     127            pDir->pvHandle      = pvHandle;
     128            pDir->uDev          = 0;
     129            pDir->offPos        = 0;
     130            pDir->fHaveData     = 0;
     131            pDir->fFirst        = 1;
     132            pDir->iInfoClass    = fFlags & BIRDDIR_F_EXTRA_INFO ? MyFileIdFullDirectoryInformation : MyFileNamesInformation;
     133            pDir->offBuf        = 0;
     134            pDir->cbBuf         = 0;
     135            pDir->pabBuf        = NULL;
    74136            return pDir;
    75137        }
    76 
    77         birdCloseFile(hFile);
    78         birdSetErrnoToNoMem();
    79     }
    80 
     138    }
     139    else
     140        assert(pvReserved == NULL);
     141    birdSetErrnoToNoMem();
    81142    return NULL;
    82 }
    83 
    84 
    85 /**
    86  * Implements opendir.
    87  */
    88 BirdDir_T *birdDirOpen(const char *pszPath)
    89 {
    90     return birdDirOpenInternal(pszPath, NULL, 1 /*fMinimalInfo*/);
    91 }
    92 
    93 
    94 /**
    95  * Alternative opendir, with extra stat() info returned by readdir().
    96  */
    97 BirdDir_T *birdDirOpenExtraInfo(const char *pszPath)
    98 {
    99     return birdDirOpenInternal(pszPath, NULL, 0 /*fMinimalInfo*/);
    100143}
    101144
     
    158201                                     FALSE,     /* fReturnSingleEntry */
    159202                                     NULL,      /* Filter / restart pos. */
    160                                      FALSE);    /* fRestartScan */
     203                                     pDir->fFlags & BIRDDIR_F_RESTART_SCAN ? TRUE : FALSE); /* fRestartScan */
    161204    if (!MY_NT_SUCCESS(rcNt))
    162205    {
     
    173216    pDir->offBuf    = 0;
    174217    pDir->fHaveData = 1;
     218    pDir->fFlags    &= ~BIRDDIR_F_RESTART_SCAN;
    175219
    176220    return 0;
     
    355399
    356400    pDir->uMagic++;
    357     birdCloseFile((HANDLE)pDir->pvHandle);
     401    if (pDir->fFlags & BIRDDIR_F_CLOSE_HANDLE)
     402        birdCloseFile((HANDLE)pDir->pvHandle);
    358403    pDir->pvHandle = (void *)INVALID_HANDLE_VALUE;
    359404    birdMemFree(pDir->pabBuf);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette