Esempio n. 1
0
int
wmain(int argc, LPWSTR *argv)
{
  UNICODE_STRING NtPath;
  OBJECT_ATTRIBUTES objattr;
  NTSTATUS stat;

  SetOemPrintFLineLength(GetStdHandle(STD_ERROR_HANDLE));

  if (argc < 2)
    {
      fprintf(stderr, "Usage:\r\n%ws file [...]\r\n", argv[0]);
      return 1;
    }

  while (--argc)
    {
      if ((++argv)[0][0] == '\0')
	continue;

      if (argv[0][0] == L'\\')
	stat = RtlCreateUnicodeString(&NtPath, argv[0]);
      else
	stat = RtlDosPathNameToNtPathName_U(argv[0], &NtPath, NULL, NULL);

      if (!NT_SUCCESS(stat))
	{
	  LPSTR szErrMsg = nt_errmsgA(stat);
	  oem_printf(stderr, "Error: '%1!ws!': %2%%n",
		     argv[0],
		     szErrMsg);
	  LocalFree(szErrMsg);
	  return 1;
	}

      InitializeObjectAttributes(&objattr, &NtPath, OBJ_CASE_INSENSITIVE, NULL,
				 NULL);

      stat = NtDeleteFile(&objattr);

      if (NT_SUCCESS(stat))
	oem_printf(stderr, "Success: '%1!ws!'%%n", argv[0]);
      else
	{
	  LPSTR szErrMsg = nt_errmsgA(stat);
	  oem_printf(stderr, "Error: '%1!ws!': %2%%n",
		     argv[0],
		     szErrMsg);
	  LocalFree(szErrMsg);
	}

      RtlFreeUnicodeString(&NtPath);
    }

  return 0;
}
static NTSTATUS NtRemoveSingleFile(POBJECT_ATTRIBUTES PtrObjectAttributes)
{
    NTSTATUS Status = STATUS_SUCCESS;
    ULONG TryCount = 0;

    // Attempt to delete the file
    __TryDeleteFile:
    Status = NtDeleteFile(PtrObjectAttributes);

    // If STATUS_ACCESS_DENIED, try to rewrite the security descriptor
    if(Status == STATUS_ACCESS_DENIED && TryCount == 0)
    {
        Status = NtSetFileAccessToEveryone(PtrObjectAttributes, GENERIC_ALL | DELETE);
        if(NT_SUCCESS(Status))
        {
            TryCount++;
            goto __TryDeleteFile;
        }
    }

    return Status;
}
Esempio n. 3
0
void test_query_directory( void )
{
	WCHAR dirname[] = L"\\??\\c:\\filetest";
	WCHAR filename[] = L"\\??\\c:\\filetest\\edb.chk";
	WCHAR edb[] = L"edb<\"*";
	UNICODE_STRING path, mask, empty;
	OBJECT_ATTRIBUTES oa;
	HANDLE dir, file;
	IO_STATUS_BLOCK iosb;
	BYTE buffer[0x100];
	NTSTATUS r;

	iosb.Status = ~0;
	iosb.Information = ~0;

	empty.Buffer = 0;
	empty.Length = 0;
	empty.MaximumLength = 0;

	init_us(&mask, edb);

	oa.Length = sizeof oa;
	oa.RootDirectory = 0;
	oa.ObjectName = &path;
	oa.Attributes = OBJ_CASE_INSENSITIVE;
	oa.SecurityDescriptor = 0;
	oa.SecurityQualityOfService = 0;

	init_us(&path, filename);
	r = NtDeleteFile( &oa );

	// delete the file to ensure preconditions
	init_us(&path, dirname);
	r = NtDeleteFile( &oa );

	// create a test directory
	r = NtCreateFile( &dir, GENERIC_READ | GENERIC_WRITE | FILE_LIST_DIRECTORY, &oa, &iosb,
			0, FILE_ATTRIBUTE_DIRECTORY, FILE_SHARE_READ, FILE_CREATE, FILE_DIRECTORY_FILE, 0, 0 );
	ok( r == STATUS_SUCCESS, "failed to create dir %08lx\n", r);
	ok( iosb.Status == STATUS_SUCCESS, "status wrong %08lx\n", iosb.Status);
	ok( iosb.Information == FILE_CREATED, "information wrong %08lx\n", iosb.Information);

	// add a file to the directory
	init_us(&path, filename);

	r = NtCreateFile( &file, GENERIC_READ | GENERIC_WRITE, &oa, &iosb,
			0, FILE_ATTRIBUTE_DIRECTORY, FILE_SHARE_READ, FILE_CREATE, 0, 0, 0 );
	ok( r == STATUS_SUCCESS, "failed to create file %08lx\n", r);
	ok( iosb.Status == STATUS_SUCCESS, "status wrong %08lx\n", iosb.Status);
	ok( iosb.Information == FILE_CREATED, "information wrong %08lx\n", iosb.Information);

	r = NtClose( file );
	ok( r == STATUS_SUCCESS, "status wrong %08lx\n", r);

	// query first file... should be "."
	r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, 0, 0);
	ok( r == STATUS_SUCCESS, "failed to query directory %08lx\n", r);
	check_dot(&iosb, buffer);

	// query second file... should be ".."
	r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, 0, 0);
	ok( r == STATUS_SUCCESS, "failed to query directory %08lx\n", r);
	check_dotdot(&iosb, buffer);

	// query third file... should be "edb.chk"
	r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, 0, 0);
	ok( r == STATUS_SUCCESS, "failed to query directory %08lx\n", r);
	check_edb(&iosb, buffer);

	// no more files...
	r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, 0, 0);
	ok( r == STATUS_NO_MORE_FILES, "failed to query directory %08lx\n", r);

	// try with a mask
	r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, &mask, TRUE);
	ok( r == STATUS_SUCCESS, "failed to query directory %08lx\n", r);
	ok( iosb.Status == STATUS_SUCCESS, "status wrong %08lx\n", iosb.Status);
	check_dot(&iosb, buffer);

	r = NtClose( dir );
	ok( r == STATUS_SUCCESS, "failed to close handle %08lx\n", r);

	// set oa to point the the directory again
	init_us(&path, dirname);

	// re-open the file and scan with a mask
	// looks like the mask is set on the first scan after opening the directory
	r = query_one(&oa, edb, buffer, sizeof buffer, &iosb);
	ok( r == STATUS_SUCCESS, "query failed %08lx\n", r);
	check_edb(&iosb, buffer);

	// what happens if the mask is present but empty?
	r = query_one(&oa, L"", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_SUCCESS, "query failed %08lx\n", r);
	check_dot(&iosb, buffer);

	// how does * work?
	r = query_one(&oa, L"*", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_SUCCESS, "query failed %08lx\n", r);
	check_dot(&iosb, buffer);

	// how does * work?
	r = query_one(&oa, L"*.*", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_SUCCESS, "query failed %08lx\n", r);
	check_dot(&iosb, buffer);

	// what does *e return?
	r = query_one(&oa, L"e*", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_SUCCESS, "query failed %08lx\n", r);
	check_edb(&iosb, buffer);

	// can we get back ..
	r = query_one(&oa, L"..", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r);

	// what about ... ?
	r = query_one(&oa, L"...", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r);

	// does ? work
	r = query_one(&oa, L"??", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r);

	// does ? work
	r = query_one(&oa, L"?.", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r);

	// exact match
	r = query_one(&oa, L"edb.chk", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_SUCCESS, "query failed %08lx\n", r);
	check_edb(&iosb, buffer);

	// almost exact match
	r = query_one(&oa, L"edb.ch", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r);

	// case insensitive match
	r = query_one(&oa, L"EDB.CHK", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_SUCCESS, "query failed %08lx\n", r);
	check_edb(&iosb, buffer);

	// dot star?
	r = query_one(&oa, L"edb.*", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_SUCCESS, "query failed %08lx\n", r);
	check_edb(&iosb, buffer);

	// bad masks
	r = query_one(&oa, L"|", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r);
	r = query_one(&oa, L":", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r);
	r = query_one(&oa, L"/", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r);
	r = query_one(&oa, L"\\", buffer, sizeof buffer, &iosb);
	ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r);

	// delete the file
	init_us(&path, filename);
	r = NtDeleteFile( &oa );
	ok( r == STATUS_SUCCESS, "failed to delete directory %08lx\n", r);

	// delete the directory
	init_us(&path, dirname);
	r = NtDeleteFile( &oa );
	ok( r == STATUS_SUCCESS, "failed to delete directory %08lx\n", r);
}