5

我正在使用 Windows Cloud Filter API 创建虚拟驱动器。删除回调在 Windows Home 21H1 19043.1165 (cldflt.sys 10.0.19041.1110) 上按预期停止工作。如果我从 CF_CALLBACK_TYPE_NOTIFY_DELETE 返回错误代码,则无论如何都会删除脱水占位符,无论我返回的错误代码如何:

void CALLBACK FakeCloudProvider::OnNotifyDelete(
    _In_ CONST CF_CALLBACK_INFO* callbackInfo,
    _In_ CONST CF_CALLBACK_PARAMETERS* callbackParameters)
{
    CF_OPERATION_INFO opInfo = { 0 };
    
    opInfo.StructSize = sizeof(CF_OPERATION_INFO);
    opInfo.Type = CF_OPERATION_TYPE_ACK_DELETE;
    opInfo.ConnectionKey = callbackInfo->ConnectionKey;
    opInfo.TransferKey = callbackInfo->TransferKey;
    opInfo.CorrelationVector = callbackInfo->CorrelationVector;
    opInfo.RequestKey = callbackInfo->RequestKey;

    CF_SYNC_STATUS_MSG* syncStatus = new CF_SYNC_STATUS_MSG;
    syncStatus->Code = STATUS_FILE_LOCKED_WITH_WRITERS;
    syncStatus->SetMsg(L"MY TEST");

    opInfo.SyncStatus = syncStatus;
    
    CF_OPERATION_PARAMETERS params = {0};
    params.ParamSize = sizeof(CF_OPERATION_PARAMETERS);
    params.AckDelete.Flags = CF_OPERATION_ACK_DELETE_FLAG_NONE;

    // I have also tested many other error codes.
    params.AckDelete.CompletionStatus = STATUS_FILE_LOCKED_WITH_WRITERS; 
    
    HRESULT res = CfExecute(&opInfo, &params);
}

我已经测试了从 Windows 资源管理器和 Windows 21H1 上的命令提示符删除。结果是相同的 - 占位符被删除。

我还重新测试了旧版本的删除 - Windows 10 Pro 1909 (18363.1556) (cldflt.sys 10.0.18362.1533) 并且一切都按预期工作 - 如果我从删除回调中返回错误,则文件不会被删除。

我猜这是最新 Windows 更新中的错误。有人能找到解决这种行为的方法吗?

4

2 回答 2

7

这是 Windows 云过滤器 API 中的一个已知问题。它影响 Windows 20H1 及更高版本。这是关于这个问题的讨论:https ://docs.microsoft.com/en-us/answers/questions/75240/bug-report-cfapi-ackdelete-borken-on-win10-2004.html没有任何真实的据我所知,目前的解决方案。返回任何特定的错误代码都无济于事。唯一可能的解决方案是稍后在同步期间在本地文件系统中重新创建已删除的文件。

于 2021-08-23T05:36:35.777 回答
2

刚刚在 Windows 11 (build 10.0.22000.194) 上测试,看来这个 bug 终于被修复了。

于 2021-09-18T01:24:07.923 回答