61c44b72d4
(STATUS_OBJECT_PATH_NOT_FOUND): Define. (STATUS_BUFFER_OVERFLOW): Define. (FILE_SUPERSEDED): Define. (FILE_OPENED): Define. (FILE_CREATED): Define. (FILE_OVERWRITTEN): Define. (FILE_EXISTS): Define. (FILE_DOES_NOT_EXIST): Define. (PIO_APC_ROUTINE): Typedef. (NtFsControlFile): Fix parameter types to use PIO_APC_ROUTINE. (NtWriteFile): Declare. (RtlInt64ToHexUnicodeString): Declare. * strfuncs.cc: Include ntdll.h. (RtlInt64ToHexUnicodeString): New function. * syscalls.cc (try_to_bin): Rewrite using native NT functions. Only try to create recycle bin after unsuccessfully trying to move file. Also try to create special files in recycle bin so that Windows Explorer isn't unnecessarily stampeded.
65 lines
1.6 KiB
C++
65 lines
1.6 KiB
C++
/* strfuncs.cc: misc funcs that don't belong anywhere else
|
|
|
|
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
|
2005, 2006, 2007 Red Hat, Inc.
|
|
|
|
This file is part of Cygwin.
|
|
|
|
This software is a copyrighted work licensed under the terms of the
|
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
|
details. */
|
|
|
|
#include "winsup.h"
|
|
#include <winbase.h>
|
|
#include <winnls.h>
|
|
#include <ntdll.h>
|
|
|
|
codepage_type current_codepage = ansi_cp;
|
|
|
|
UINT
|
|
get_cp ()
|
|
{
|
|
return current_codepage == ansi_cp ? GetACP() : GetOEMCP();
|
|
}
|
|
|
|
/* tlen is always treated as the maximum buffer size, including the '\0'
|
|
character. sys_wcstombs will always return a 0-terminated result, no
|
|
matter what. */
|
|
int __stdcall
|
|
sys_wcstombs (char *tgt, int tlen, const WCHAR *src, int slen)
|
|
{
|
|
int ret;
|
|
|
|
ret = WideCharToMultiByte (get_cp (), 0, src, slen, tgt, tlen, NULL, NULL);
|
|
if (ret)
|
|
tgt[ret < tlen ? ret : tlen - 1] = '\0';
|
|
return ret;
|
|
}
|
|
|
|
int __stdcall
|
|
sys_mbstowcs (WCHAR *tgt, const char *src, int len)
|
|
{
|
|
int res = MultiByteToWideChar (get_cp (), 0, src, -1, tgt, len);
|
|
return res;
|
|
}
|
|
|
|
static WCHAR hex_wchars[] = L"0123456789abcdef";
|
|
|
|
NTSTATUS NTAPI
|
|
RtlInt64ToHexUnicodeString (ULONGLONG value, PUNICODE_STRING dest,
|
|
BOOLEAN append)
|
|
{
|
|
USHORT len = append ? dest->Length : 0;
|
|
if (dest->MaximumLength - len < 16 * (int) sizeof (WCHAR))
|
|
return STATUS_BUFFER_OVERFLOW;
|
|
PWCHAR end = (PWCHAR) ((PBYTE) dest->Buffer + len);
|
|
register PWCHAR p = end + 16;
|
|
while (p-- > end)
|
|
{
|
|
*p = hex_wchars[value & 0xf];
|
|
value >>= 4;
|
|
}
|
|
dest->Length += 16 * sizeof (WCHAR);
|
|
return STATUS_SUCCESS;
|
|
}
|