C++ DeviceIoControl设置重分析点失败,错误为395

C++ DeviceIoControl设置重分析点失败,错误为395,c++,winapi,C++,Winapi,最近我发布了这篇文章,现在我正试图在使用WordPad应用程序修改文件后设置一个重新分析点。目前,我检查了重分析点是否为Microsoft标记,并且可以在文件丢失重分析点之前将重分析点数据保存在重分析数据缓冲区指针中。但是,当我尝试将重分析点设置到文件时,在文件修改之后,在使用控制代码FSCTL_set_repasse_point调用DeviceIoControl函数之后,我总是在GetLastError函数中得到395错误。错误395没有出现在这里,尽管我发现这个错误是有道理的。我还从文件中删

最近我发布了这篇文章,现在我正试图在使用WordPad应用程序修改文件后设置一个重新分析点。目前,我检查了重分析点是否为Microsoft标记,并且可以在文件丢失重分析点之前将重分析点数据保存在重分析数据缓冲区指针中。但是,当我尝试将重分析点设置到文件时,在文件修改之后,在使用控制代码FSCTL_set_repasse_point调用DeviceIoControl函数之后,我总是在GetLastError函数中得到395错误。错误395没有出现在这里,尽管我发现这个错误是有道理的。我还从文件中删除了全权访问控制列表(DACL),以授予每个人对文件的完全访问权限,然后尝试设置重分析点,但我遇到了相同的错误。在这里,我放置了两段代码来获取和设置重分析点。我将感谢任何帮助

获取重分析点的代码

            HANDLE hDevice = CreateFile(
                filePath.c_str(), // File path in the computer
                0,
                FILE_SHARE_READ,
                NULL,
                OPEN_EXISTING,
                FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
                NULL);

            if (hDevice != INVALID_HANDLE_VALUE)
            {
                size_t maxReparse = MAXIMUM_REPARSE_DATA_BUFFER_SIZE;
                rdb = (REPARSE_DATA_BUFFER*)malloc(maxReparse); // rdb was declared as: REPARSE_DATA_BUFFER* rdb;
                DWORD outBufferSize = maxReparse;
                DWORD bytesReturned = 0;
                
                if (DeviceIoControl(hDevice, FSCTL_GET_REPARSE_POINT, NULL, 0, rdb, outBufferSize, &bytesReturned, NULL))
                {
                    if (rdb != NULL)
                    {
                        if (IsReparseTagMicrosoft(rdb->ReparseTag))
                        {
                            wprintf(L"Is a Microsoft tag.\n");
                        }
            LPTSTR pszObjName = const_cast<wchar_t*>(filePath.c_str()); // File path in the computer
            PACL newDACL = NULL; // NULL discretionary access control list to grant full access to everyone
            DWORD secInfo = SetNamedSecurityInfo(pszObjName, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, newDACL, NULL);

            if (secInfo == ERROR_SUCCESS)
            {
                HANDLE hDevice = CreateFile(filePath.c_str(),
                    GENERIC_ALL, //GENERIC_READ | GENERIC_WRITE,
                    FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
                    FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);

                if (hDevice != INVALID_HANDLE_VALUE)
                {
                    size_t maxReparse = MAXIMUM_REPARSE_DATA_BUFFER_SIZE;
                    DWORD inBufferSize = maxReparse;

                    if (rdb != NULL)
                    {
                        DWORD bytesReturned = 0;

                        if (!DeviceIoControl(hDevice, FSCTL_SET_REPARSE_POINT, rdb, inBufferSize, NULL, 0, &bytesReturned, NULL))
                        {
                            DWORD error = GetLastError(); // Error 395
                            unsigned long errorUL = error;
                            wprintf(L"Error %lu in DeviceIoControl method.\n", errorUL);
                        }
设置重分析点的代码

            HANDLE hDevice = CreateFile(
                filePath.c_str(), // File path in the computer
                0,
                FILE_SHARE_READ,
                NULL,
                OPEN_EXISTING,
                FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
                NULL);

            if (hDevice != INVALID_HANDLE_VALUE)
            {
                size_t maxReparse = MAXIMUM_REPARSE_DATA_BUFFER_SIZE;
                rdb = (REPARSE_DATA_BUFFER*)malloc(maxReparse); // rdb was declared as: REPARSE_DATA_BUFFER* rdb;
                DWORD outBufferSize = maxReparse;
                DWORD bytesReturned = 0;
                
                if (DeviceIoControl(hDevice, FSCTL_GET_REPARSE_POINT, NULL, 0, rdb, outBufferSize, &bytesReturned, NULL))
                {
                    if (rdb != NULL)
                    {
                        if (IsReparseTagMicrosoft(rdb->ReparseTag))
                        {
                            wprintf(L"Is a Microsoft tag.\n");
                        }
            LPTSTR pszObjName = const_cast<wchar_t*>(filePath.c_str()); // File path in the computer
            PACL newDACL = NULL; // NULL discretionary access control list to grant full access to everyone
            DWORD secInfo = SetNamedSecurityInfo(pszObjName, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, newDACL, NULL);

            if (secInfo == ERROR_SUCCESS)
            {
                HANDLE hDevice = CreateFile(filePath.c_str(),
                    GENERIC_ALL, //GENERIC_READ | GENERIC_WRITE,
                    FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
                    FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);

                if (hDevice != INVALID_HANDLE_VALUE)
                {
                    size_t maxReparse = MAXIMUM_REPARSE_DATA_BUFFER_SIZE;
                    DWORD inBufferSize = maxReparse;

                    if (rdb != NULL)
                    {
                        DWORD bytesReturned = 0;

                        if (!DeviceIoControl(hDevice, FSCTL_SET_REPARSE_POINT, rdb, inBufferSize, NULL, 0, &bytesReturned, NULL))
                        {
                            DWORD error = GetLastError(); // Error 395
                            unsigned long errorUL = error;
                            wprintf(L"Error %lu in DeviceIoControl method.\n", errorUL);
                        }
LPTSTR pszObjName=const_cast(filePath.c_str());//计算机中的文件路径
PACL newDACL=NULL;//授予所有人完全访问权限的NULL全权访问控制列表
DWORD secInfo=SetNamedSecurityInfo(pszObjName、SE_文件_对象、DACL_安全_信息、NULL、NULL、newDACL、NULL);
如果(secInfo==错误\成功)
{
HANDLE hDevice=CreateFile(filePath.c_str(),
GENERIC_ALL,//GENERIC_READ | GENERIC_WRITE,
文件共享读取文件共享写入,空,打开,
文件(标志)备份(语义|文件(标志)打开(重新分析)点,空);
if(hDevice!=无效的句柄值)
{
size\u t maxrespace=最大重分析数据缓冲区大小;
DWORD inBufferSize=最大重分析;
如果(rdb!=NULL)
{
DWORD字节返回=0;
if(!DeviceIoControl(hDevice、FSCTL\u SET\u repasse\u POINT、rdb、inBufferSize、NULL、0和bytesReturned、NULL))
{
DWORD error=GetLastError();//错误395
无符号长错误ul=错误;
wprintf(L“设备控制方法中的错误%lu。\n”,errorUL);
}

具体文件出现此错误?是否尝试使用其他文件?您好RbMn,目前我只处理两个txt文件,两个文件都出现了相同的问题。此错误仅适用于某些具体文件。一般来说,你如何理解在
FSCTL\u SET\u repasse\u POINT
上没有错误。因此,请尝试为notepad.exe设置符号链接。对于这个问题,我认为这不是符号链接,因为这些文件不指向其他文件,错误发生在记事本和写字板应用程序上。这是文件而不是应用程序的问题。您需要在一些常用文件上测试代码