#include #include #include /* compile as follows: gcc -o create_raw create_raw.c -lntdll */ typedef struct _IO_STATUS_BLOCK { NTSTATUS Status; ULONG Information; } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; NTSTATUS NTAPI ZwCreateFile (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK, PLARGE_INTEGER, ULONG, ULONG, ULONG, ULONG, PVOID, ULONG); NTSTATUS NTAPI ZwClose (HANDLE); #define sys_mbstowcs(_t,_s,_l) MultiByteToWideChar(CP_ACP,0,(_s),-1,(_t),(_l)) static void str2buf2uni (UNICODE_STRING *tgt, WCHAR *buf, const char *srcstr) { tgt->Length = strlen (srcstr) * sizeof (WCHAR); tgt->MaximumLength = tgt->Length + sizeof(WCHAR); tgt->Buffer = (PWCHAR) buf; sys_mbstowcs (buf, srcstr, tgt->MaximumLength); } #define _SHARED (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE) #define _CASE_SENSITIVE (0) /* NT Create CreateDisposition values */ #define FILE_SUPERSEDE (0) #define FILE_OPEN (1) #define FILE_CREATE (2) #define FILE_OPEN_IF (3) #define FILE_OVERWRITE (4) #define FILE_OVERWRITE_IF (5) /* NT Create CreateOptions bits */ #define FILE_DIRECTORY_FILE (0x00000001) #define FILE_WRITE_THROUGH (0x00000002) #define FILE_SEQUENTIAL_ONLY (0x00000004) #define FILE_NON_DIRECTORY_FILE (0x00000040) #define FILE_NO_EA_KNOWLEDGE (0x00000200) #define FILE_EIGHT_DOT_THREE_ONLY (0x00000400) #define FILE_RANDOM_ACCESS (0x00000800) #define FILE_DELETE_ON_CLOSE (0x00001000) /* NT Create SecurityFlags bits */ #define SMB_SECURITY_DYNAMIC_TRACKING (0x01) #define SMB_SECURITY_EFFECTIVE_ONLY (0x02) /* NT Create CreateAction return values */ #define FILE_SUPERSEDED (0) #define FILE_OPENED (1) #define FILE_CREATED (2) #define FILE_OVERWRITTEN (3) #define FILE_EXISTS (4) #define FILE_DOES_NOT_EXIST (5) #define STATUS_OBJECT_NAME_NOT_FOUND 0xC0000034 #define STATUS_OBJECT_PATH_SYNTAX_BAD 0xC000003B #define _ACCESS (GENERIC_READ | GENERIC_WRITE) int main() { UNICODE_STRING dev; WCHAR devname[MAX_PATH + 1]; OBJECT_ATTRIBUTES attr; HANDLE h; HANDLE hd; IO_STATUS_BLOCK io; NTSTATUS status; /* * Create /cygdrive/c/makefile */ str2buf2uni (&dev, devname, "\\??\\C:\\makefile"); InitializeObjectAttributes (&attr, &dev, _CASE_SENSITIVE, NULL, NULL); status = ZwCreateFile (&h, _ACCESS, &attr, &io, NULL, FILE_ATTRIBUTE_NORMAL, _SHARED, FILE_OPEN_IF, FILE_NON_DIRECTORY_FILE, NULL, 0); if (!NT_SUCCESS (status)) { printf("ERROR: %08lx (%08lx, %08lx)\n", status, io.Status, io.Information); return 1; } if (!h) { printf("ERROR: no handle\n"); return 1; } status = ZwClose (h); if (!NT_SUCCESS (status)) { printf("ERROR: %08lx\n", status); return 1; } /* * Create /cygdrive/c/Makefile */ str2buf2uni (&dev, devname, "\\??\\C:\\Makefile"); InitializeObjectAttributes (&attr, &dev, _CASE_SENSITIVE, NULL, NULL); status = ZwCreateFile (&h, _ACCESS, &attr, &io, NULL, FILE_ATTRIBUTE_NORMAL, _SHARED, FILE_OPEN_IF, FILE_NON_DIRECTORY_FILE, NULL, 0); if (!NT_SUCCESS (status)) { printf("ERROR: %08lx (%08lx, %08lx)\n", status, io.Status, io.Information); return 1; } if (!h) { printf("ERROR: no handle\n"); return 1; } status = ZwClose (h); if (!NT_SUCCESS (status)) { printf("ERROR: %08lx\n", status); return 1; } return 0; }