On Feb  4 12:08, Corinna Vinschen via Cygwin wrote:
> $ cat > mk-dev-nfs.c <<EOF
> [...]

Copy/Paste error, try this one:

#include <stdio.h>
#include <windows.h>
#include <winternl.h>

typedef struct {
    DWORD  ReparseTag;
    WORD   ReparseDataLength;
    WORD   Reserved;
    struct {
        BYTE   DataBuffer[1];
    } GenericReparseBuffer;
    struct {
        ULONGLONG       Type;
        union {
          struct {
            ULONG       Major;
            ULONG       Minor;
          } Device;
          WCHAR         LnkBuffer[1];
        };
    } NfsReparseBuffer;
} MY_REPARSE_DATA_BUFFER, *MY_PREPARSE_DATA_BUFFER;

#define NFS_SPECFILE_LNK        0x00000000014B4E4CL
#define NFS_SPECFILE_CHR        0x0000000000524843L
#define NFS_SPECFILE_BLK        0x00000000004B4C42L
#define NFS_SPECFILE_FIFO       0x000000004F464946L
#define NFS_SPECFILE_SOCK       0x000000004B434F53L

int
main (int argc, char **argv)
{
  HANDLE fh;
  char buf[65536];
  DWORD size_ret;
  MY_PREPARSE_DATA_BUFFER rp;

  if (argc < 3)
    {
      fprintf (stderr, "usage: %s <name> b|c|f|s [major] [minor]\n", argv[0]);
      return 1;
    }
  fh = CreateFile (argv[1],
                   GENERIC_WRITE,
                   0,
                   NULL,
                   CREATE_ALWAYS,
                   FILE_FLAG_BACKUP_SEMANTICS
                   | FILE_FLAG_OPEN_REPARSE_POINT,
                   NULL);
  if (fh == INVALID_HANDLE_VALUE)
    {
      fprintf (stderr, "CreateFile: %d\n", GetLastError ());
      return 1;
    }

  rp = (MY_PREPARSE_DATA_BUFFER) buf;
  rp->ReparseTag = IO_REPARSE_TAG_NFS;
  rp->ReparseDataLength = sizeof (ULONGLONG);
  switch (argv[2][0])
    {
    case 'b':
    case 'c':
      if (argc != 5)
        {
          fprintf (stderr, "usage: %s <name> b|c|f|s [major] [minor]\n",
                   argv[0]);
          return 1;
        }
      rp->ReparseDataLength += 2 * sizeof (ULONG);
      rp->NfsReparseBuffer.Type = argv[2][0] == 'b' ?
                                  NFS_SPECFILE_BLK
                                  : NFS_SPECFILE_CHR;
      rp->NfsReparseBuffer.Device.Major = strtoul (argv[3], NULL, 0);
      rp->NfsReparseBuffer.Device.Minor = strtoul (argv[4], NULL, 0);
      break;
    case 'f':
      rp->NfsReparseBuffer.Type = NFS_SPECFILE_FIFO;
      break;
    case 's':
      rp->NfsReparseBuffer.Type = NFS_SPECFILE_SOCK;
      break;
    }

  if (! DeviceIoControl (fh, FSCTL_SET_REPARSE_POINT,
                         (LPVOID) buf,
                         REPARSE_GUID_DATA_BUFFER_HEADER_SIZE
                         + rp->ReparseDataLength,
                         NULL, 0, &size_ret, NULL))
    {
      fprintf (stderr, "DeviceIoControl: %d\n", GetLastError ());
      CloseHandle (fh);
      DeleteFile (argv[1]);
      return 1;
    }
  CloseHandle (fh);
  return 0;
}

-- 
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

Reply via email to