pastebin - collaborative debugging tool
rovema.kpaste.net RSS


[patch] msnfs41client: |FsRtlCopyRead2()|+|FsRtlCopyWrite2()| rework+enable+staleclientidlockfix+misc, 2024-10-10 ...
Posted by Anonymous on Thu 10th Oct 2024 17:13
raw | new post

  1. From def585ca1b197dadaa8d1c4f6a6bbcebfecb7edd Mon Sep 17 00:00:00 2001
  2. From: Roland Mainz <roland.mainz@nrubsig.org>
  3. Date: Thu, 10 Oct 2024 12:37:22 +0200
  4. Subject: [PATCH 1/5] daemon: Fix lock release in |NFS4ERR_STALE_CLIENTID|
  5.  handling
  6.  
  7. Fix lock release in |NFS4ERR_STALE_CLIENTID| handling.
  8.  
  9. Reviewed-by: Dietmar Kuenkler <dietmar.kuenkler@rovema.de>
  10. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  11. ---
  12. daemon/nfs41_compound.c | 2 +-
  13.  1 file changed, 1 insertion(+), 1 deletion(-)
  14.  
  15. diff --git a/daemon/nfs41_compound.c b/daemon/nfs41_compound.c
  16. index f28773b..753096a 100644
  17. --- a/daemon/nfs41_compound.c
  18. +++ b/daemon/nfs41_compound.c
  19. @@ -226,7 +226,7 @@ retry:
  20.              AcquireSRWLockShared(&session->client->exid_lock);
  21.              csa->csa_clientid = session->client->clnt_id;
  22.              csa->csa_sequence = session->client->seq_id;
  23. -            AcquireSRWLockShared(&session->client->exid_lock);
  24. +            ReleaseSRWLockShared(&session->client->exid_lock);
  25.          }
  26.          goto do_retry;
  27.  
  28. --
  29. 2.45.1
  30.  
  31. From 3b6d239b32f87721f97ed6e9694f0f390ef4fa2f Mon Sep 17 00:00:00 2001
  32. From: Roland Mainz <roland.mainz@nrubsig.org>
  33. Date: Thu, 10 Oct 2024 12:48:10 +0200
  34. Subject: [PATCH 2/5] daemon: |compound_encode_send_decode()| should print a
  35.  warning every 10 retries
  36.  
  37. |compound_encode_send_decode()| should print a warning every 10 retries.
  38.  
  39. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  40. ---
  41. daemon/nfs41_compound.c | 14 ++++++++++++--
  42.  1 file changed, 12 insertions(+), 2 deletions(-)
  43.  
  44. diff --git a/daemon/nfs41_compound.c b/daemon/nfs41_compound.c
  45. index 753096a..ff16f4a 100644
  46. --- a/daemon/nfs41_compound.c
  47. +++ b/daemon/nfs41_compound.c
  48. @@ -149,6 +149,11 @@ int compound_encode_send_decode(
  49.  retry:
  50.      /* send compound */
  51.      retry_count++;
  52. +    if ((retry_count % 10) == 0) {
  53. +        /* Print a warning every 10 retries */
  54. +        eprintf("compound_encode_send_decode: retry_count=%d\n",
  55. +            (int)retry_count);
  56. +    }
  57.      set_expected_res(compound);
  58.      status = nfs41_send_compound(session->client->rpc,
  59.          (char *)&compound->args, (char *)&compound->res);
  60. @@ -278,8 +283,13 @@ retry:
  61.                  delayby = 5000;
  62.              else
  63.                  delayby = 500*retry_count;
  64. -            DPRINTF(1, ("Compound returned '%s': sleeping for %ums..\n",
  65. -                (compound->res.status==NFS4ERR_GRACE)?"NFS4ERR_GRACE":"NFS4ERR_DELAY",
  66. +            DPRINTF(1,
  67. +                ("compound_encode_send_decode: "
  68. +                "Compound returned '%s': "
  69. +                "retry_count=%d, sleeping for %ums..\n",
  70. +                ((compound->res.status==NFS4ERR_GRACE)?
  71. +                    "NFS4ERR_GRACE":"NFS4ERR_DELAY"),
  72. +                (int)retry_count,
  73.                  delayby));
  74.              Sleep(delayby);
  75.              DPRINTF(1, ("Attempting to resend compound.\n"));
  76. --
  77. 2.45.1
  78.  
  79. From dd3a293ce16dbf871a15d06732222eb7a38a602e Mon Sep 17 00:00:00 2001
  80. From: Roland Mainz <roland.mainz@nrubsig.org>
  81. Date: Thu, 10 Oct 2024 13:04:35 +0200
  82. Subject: [PATCH 3/5] sys: Fix annotation for |nfs41_FsdDispatch()|
  83.  
  84. Fix annotation for |nfs41_FsdDispatch()|
  85.  
  86. References:
  87. https://learn.microsoft.com/en-us/windows-hardware/drivers/devtest/28168-dispatch-function-dispatch-annotation
  88.  
  89. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  90. ---
  91. sys/nfs41_driver.c | 4 +++-
  92.  1 file changed, 3 insertions(+), 1 deletion(-)
  93.  
  94. diff --git a/sys/nfs41_driver.c b/sys/nfs41_driver.c
  95. index 5bd9508..77a454c 100644
  96. --- a/sys/nfs41_driver.c
  97. +++ b/sys/nfs41_driver.c
  98. @@ -114,7 +114,9 @@ nfs41_timings lookup, readdir, open, close, getattr, setattr, getacl, setacl, vo
  99.  #endif
  100.  DRIVER_INITIALIZE DriverEntry;
  101.  DRIVER_UNLOAD nfs41_driver_unload;
  102. -DRIVER_DISPATCH ( nfs41_FsdDispatch );
  103. +_Dispatch_type_(IRP_MJ_CREATE) \
  104. +    _Dispatch_type_(IRP_MJ_CREATE_NAMED_PIPE) \
  105. +    DRIVER_DISPATCH(nfs41_FsdDispatch);
  106.  
  107.  struct _MINIRDR_DISPATCH nfs41_ops;
  108.  PRDBSS_DEVICE_OBJECT nfs41_dev;
  109. --
  110. 2.45.1
  111.  
  112. From 69686e99824e6019a1e654327b3fe0d47f660f1c Mon Sep 17 00:00:00 2001
  113. From: Dan Shelton <dan.f.shelton@gmail.com>
  114. Date: Thu, 10 Oct 2024 18:00:41 +0200
  115. Subject: [PATCH 4/5] sys: Add CcZeroData() support to
  116.  FsRtlCopyWrite2()+cleanup
  117.  
  118. Add CcZeroData() support to FsRtlCopyWrite2()+cleanup
  119.  
  120. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  121. ---
  122. sys/copysup.c | 375 +++++++++++++++++++++++++-------------------------
  123.  1 file changed, 184 insertions(+), 191 deletions(-)
  124.  
  125. diff --git a/sys/copysup.c b/sys/copysup.c
  126. index 8e9b384..515e465 100644
  127. --- a/sys/copysup.c
  128. +++ b/sys/copysup.c
  129. @@ -59,10 +59,9 @@
  130.  #include "nfs41_debug.h"
  131.  #include "nfs41_build_features.h"
  132.  
  133. -#if defined(_ARM_) || defined(_ARM64_)
  134. -
  135.  #define COPYSUP_MAX_HOLE_SIZE (2*4096LL)
  136.  
  137. +
  138.  BOOLEAN FsRtlCopyRead2(
  139.      IN PFILE_OBJECT FObj,
  140.      IN PLARGE_INTEGER FileOffset,
  141. @@ -72,29 +71,27 @@ BOOLEAN FsRtlCopyRead2(
  142.      OUT PVOID Buffer,
  143.      OUT PIO_STATUS_BLOCK IoStatus,
  144.      IN PDEVICE_OBJECT DeviceObject,
  145. -    IN PVOID TopLevelContext)
  146. +    IN ULONG_PTR TopLevelContext
  147. +)
  148.  {
  149.      BOOLEAN retval = TRUE;
  150.      ULONG pagecount;
  151.      LARGE_INTEGER readpos_end;
  152. +    PDEVICE_OBJECT RelatedDeviceObject;
  153.      PFSRTL_COMMON_FCB_HEADER fo_fcb;
  154.  
  155. -    pagecount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(FileOffset, Length);
  156. +    pagecount = ADDRESS_AND_SIZE_TO_SPAN_PAGES((ULongToPtr(FileOffset->LowPart)), Length);
  157.  
  158.      if (Length == 0) {
  159. -        IoStatus->Information = 0;
  160.          IoStatus->Status = STATUS_SUCCESS;
  161. -        retval = TRUE;
  162. -        goto done;
  163. -    }
  164. +        IoStatus->Information = 0;
  165.  
  166. -    readpos_end.QuadPart = FileOffset->QuadPart + Length;
  167. -    if (readpos_end.QuadPart <= 0) {
  168. -        retval = FALSE;
  169. +        retval = TRUE;
  170.          goto done;
  171.      }
  172.  
  173. -    fo_fcb = FObj->FsContext;
  174. +    readpos_end.QuadPart = FileOffset->QuadPart + (LONGLONG)Length;
  175. +    fo_fcb = (PFSRTL_COMMON_FCB_HEADER)FObj->FsContext;
  176.  
  177.      FsRtlEnterFileSystem();
  178.  
  179. @@ -115,7 +112,6 @@ BOOLEAN FsRtlCopyRead2(
  180.      }
  181.  
  182.      if (fo_fcb->IsFastIoPossible == FastIoIsQuestionable) {
  183. -        PDEVICE_OBJECT RelatedDeviceObject;
  184.          PFAST_IO_DISPATCH FastIoDispatch;
  185.  
  186.          RelatedDeviceObject = IoGetRelatedDeviceObject(FObj);
  187. @@ -129,9 +125,14 @@ BOOLEAN FsRtlCopyRead2(
  188.              goto done_release_resource;
  189.          }
  190.  
  191. -        if (!FastIoDispatch->FastIoCheckIfPossible(
  192. -            FObj, FileOffset, Length,
  193. -            Wait, LockKey, TRUE, IoStatus, RelatedDeviceObject)) {
  194. +        if (!FastIoDispatch->FastIoCheckIfPossible(FObj,
  195. +            FileOffset,
  196. +            Length,
  197. +            Wait,
  198. +            LockKey,
  199. +            TRUE,
  200. +            IoStatus,
  201. +            RelatedDeviceObject)) {
  202.              retval = FALSE;
  203.              goto done_release_resource;
  204.          }
  205. @@ -139,8 +140,10 @@ BOOLEAN FsRtlCopyRead2(
  206.  
  207.      if (readpos_end.QuadPart > fo_fcb->FileSize.QuadPart) {
  208.          if (FileOffset->QuadPart >= fo_fcb->FileSize.QuadPart) {
  209. -            IoStatus->Information = 0;
  210.              IoStatus->Status = STATUS_END_OF_FILE;
  211. +            IoStatus->Information = 0;
  212. +
  213. +            retval = TRUE;
  214.              goto done_release_resource;
  215.          }
  216.  
  217. @@ -148,34 +151,32 @@ BOOLEAN FsRtlCopyRead2(
  218.              (ULONG)(fo_fcb->FileSize.QuadPart - FileOffset->QuadPart);
  219.      }
  220.  
  221. -    IoSetTopLevelIrp(TopLevelContext);
  222. +    IoSetTopLevelIrp((PIRP)TopLevelContext);
  223.  
  224.      retval = FALSE;
  225. -
  226.      __try {
  227. -        if ((!Wait) ||
  228. -            (readpos_end.HighPart != 0) ||
  229. -            (fo_fcb->FileSize.HighPart != 0)) {
  230. -            retval = CcCopyRead(FObj, FileOffset, Length, Wait,
  231. -                Buffer, IoStatus);
  232. -            SetFlag(FObj->Flags, FO_FILE_FAST_IO_READ);
  233. -
  234. -            ASSERT(
  235. -                ((ULONGLONG)FileOffset->QuadPart +
  236. -                    IoStatus->Information) <=
  237. -                (ULONGLONG)fo_fcb->FileSize.QuadPart);
  238. +        if (!(Wait && (readpos_end.HighPart == 0) && (fo_fcb->FileSize.HighPart == 0))) {
  239. +            retval = CcCopyRead(FObj,
  240. +                FileOffset,
  241. +                Length,
  242. +                Wait,
  243. +                Buffer,
  244. +                IoStatus);
  245. +
  246. +            FObj->Flags |= FO_FILE_FAST_IO_READ;
  247.          }
  248.          else {
  249. -            CcFastCopyRead(FObj, FileOffset->LowPart, Length,
  250. -                pagecount, Buffer, IoStatus);
  251. -            retval = TRUE;
  252. -            SetFlag(FObj->Flags, FO_FILE_FAST_IO_READ);
  253. +            CcFastCopyRead(FObj,
  254. +                FileOffset->LowPart,
  255. +                Length,
  256. +                pagecount,
  257. +                Buffer,
  258. +                IoStatus);
  259.  
  260. -            ASSERT((FileOffset->LowPart + IoStatus->Information) <=
  261. -                fo_fcb->FileSize.LowPart);
  262. -        }
  263. +            FObj->Flags |= FO_FILE_FAST_IO_READ;
  264.  
  265. -        ASSERT(IoStatus->Status == STATUS_END_OF_FILE);
  266. +            ASSERT(IoStatus->Status == STATUS_END_OF_FILE);
  267. +        }
  268.  
  269.          if (retval) {
  270.              FObj->CurrentByteOffset.QuadPart =
  271. @@ -195,6 +196,7 @@ done:
  272.      return retval;
  273.  }
  274.  
  275. +
  276.  BOOLEAN
  277.  FsRtlCopyWrite2(
  278.      IN PFILE_OBJECT FObj,
  279. @@ -205,34 +207,24 @@ FsRtlCopyWrite2(
  280.      IN PVOID Buffer,
  281.      OUT PIO_STATUS_BLOCK IoStatus,
  282.      IN PDEVICE_OBJECT DeviceObject,
  283. -    IN PVOID TopLevelContext)
  284. +    IN ULONG_PTR TopLevelContext
  285. +)
  286.  {
  287.      BOOLEAN retval; /* fixme: |volatile| ? */
  288. -    IO_STATUS_BLOCK ios;
  289. -    PFSRTL_ADVANCED_FCB_HEADER fo_fcb = FObj->FsContext;
  290. -    bool append_file;
  291. -    bool fcb_resource_acquired_shared;
  292. +    PFSRTL_COMMON_FCB_HEADER fo_fcb;
  293. +    bool fcb_resource_acquired_shared = false;
  294.      bool filesize_changed = false;
  295. -    LARGE_INTEGER filesize_orig = { .QuadPart = 0LL };
  296. -    LARGE_INTEGER validdatalength_orig = { .QuadPart = 0LL };
  297. -    LARGE_INTEGER writepos_start;
  298. -    LARGE_INTEGER writepos_end;
  299. +    bool append_file;
  300.  
  301. -    append_file =
  302. +    append_file = (bool)
  303.          ((FileOffset->LowPart == FILE_WRITE_TO_END_OF_FILE) &&
  304.          (FileOffset->HighPart == -1));
  305.  
  306. -    if (!CcCanIWrite(FObj, Length, Wait, FALSE)) {
  307. -        retval = FALSE;
  308. -        goto done;
  309. -    }
  310. -
  311. -    if (BooleanFlagOn(FObj->Flags, FO_WRITE_THROUGH)) {
  312. -        retval = FALSE;
  313. -        goto done;
  314. -    }
  315. +    fo_fcb = (PFSRTL_COMMON_FCB_HEADER)FObj->FsContext;
  316.  
  317. -    if (!CcCopyWriteWontFlush(FObj, FileOffset, Length)) {
  318. +    if (!(CcCanIWrite(FObj, Length, Wait, FALSE) &&
  319. +        !FlagOn(FObj->Flags, FO_WRITE_THROUGH) &&
  320. +        CcCopyWriteWontFlush(FObj, FileOffset, Length))) {
  321.          retval = FALSE;
  322.          goto done;
  323.      }
  324. @@ -250,18 +242,21 @@ FsRtlCopyWrite2(
  325.  #ifdef COPYSUP_FORCE4GBWRITE
  326.      if (true) {
  327.  #else
  328. -    if (!Wait || (fo_fcb->AllocationSize.HighPart != 0)) {
  329. +    if ((!Wait) || (fo_fcb->AllocationSize.HighPart != 0)) {
  330.  #endif /* COPYSUP_FORCE4GBWRITE */
  331. -        if (append_file ||
  332. -            ((FileOffset->QuadPart + Length) >
  333. -                fo_fcb->ValidDataLength.QuadPart)) {
  334. -            if (!ExAcquireResourceExclusiveLite(fo_fcb->Resource,
  335. -                Wait)) {
  336. +        LARGE_INTEGER writepos_start = { .QuadPart = 0 };
  337. +        LARGE_INTEGER writepos_end;
  338. +        LARGE_INTEGER filesize_orig = { .QuadPart = 0 };
  339. +        LARGE_INTEGER validdatalen_orig = { .QuadPart = 0 };
  340. +
  341. +        writepos_end.QuadPart = FileOffset->QuadPart + (LONGLONG)Length;
  342. +
  343. +        if (append_file || (writepos_end.QuadPart > fo_fcb->ValidDataLength.QuadPart)) {
  344. +
  345. +            if (!ExAcquireResourceExclusiveLite(fo_fcb->Resource, Wait)) {
  346.                  retval = FALSE;
  347.                  goto done_exit_filesystem;
  348.              }
  349. -
  350. -            fcb_resource_acquired_shared = false;
  351.          }
  352.          else {
  353.              if (!ExAcquireResourceSharedLite(fo_fcb->Resource, Wait)) {
  354. @@ -273,12 +268,12 @@ FsRtlCopyWrite2(
  355.          }
  356.  
  357.          if (append_file) {
  358. -            writepos_start.QuadPart = fo_fcb->FileSize.QuadPart;
  359. -            writepos_end.QuadPart = writepos_start.QuadPart + Length;
  360. +            writepos_start = fo_fcb->FileSize;
  361. +            writepos_end.QuadPart = fo_fcb->FileSize.QuadPart + (LONGLONG)Length;
  362.          }
  363.          else {
  364. -            writepos_start.QuadPart = FileOffset->QuadPart;
  365. -            writepos_end.QuadPart = writepos_start.QuadPart + Length;
  366. +            writepos_start = *FileOffset;
  367. +            writepos_end.QuadPart = FileOffset->QuadPart + (LONGLONG)Length;
  368.          }
  369.  
  370.          if ((FObj->PrivateCacheMap == NULL) ||
  371. @@ -288,16 +283,14 @@ FsRtlCopyWrite2(
  372.          }
  373.  
  374.  #ifdef COPYSUP_MAX_HOLE_SIZE
  375. -        if ((fo_fcb->ValidDataLength.QuadPart +
  376. -            COPYSUP_MAX_HOLE_SIZE) <=
  377. -                writepos_start.QuadPart) {
  378. +        if ((writepos_start.QuadPart >=
  379. +                (fo_fcb->ValidDataLength.QuadPart + COPYSUP_MAX_HOLE_SIZE))) {
  380.              retval = FALSE;
  381.              goto done_release_resource;
  382.          }
  383.  #endif /* COPYSUP_MAX_HOLE_SIZE */
  384.  
  385. -        if ((Length > (MAXLONGLONG - writepos_start.QuadPart)) ||
  386. -            (fo_fcb->AllocationSize.QuadPart < writepos_end.QuadPart)) {
  387. +        if (writepos_end.QuadPart > fo_fcb->AllocationSize.QuadPart) {
  388.              retval = FALSE;
  389.              goto done_release_resource;
  390.          }
  391. @@ -305,37 +298,30 @@ FsRtlCopyWrite2(
  392.          if (fcb_resource_acquired_shared &&
  393.              (writepos_end.QuadPart > fo_fcb->ValidDataLength.QuadPart)) {
  394.              ExReleaseResourceLite(fo_fcb->Resource);
  395. -            if (!ExAcquireResourceExclusiveLite(fo_fcb->Resource,
  396. -                Wait)) {
  397. +
  398. +            if (!ExAcquireResourceExclusiveLite(fo_fcb->Resource, Wait)) {
  399.                  retval = FALSE;
  400.                  goto done_exit_filesystem;
  401.              }
  402. -            fcb_resource_acquired_shared = false;
  403.  
  404.              if (append_file) {
  405. -                writepos_start.QuadPart = fo_fcb->FileSize.QuadPart;
  406. -                writepos_end.QuadPart = writepos_start.QuadPart + Length;
  407. +                writepos_start = fo_fcb->FileSize;
  408. +                writepos_end.QuadPart = fo_fcb->FileSize.QuadPart + (LONGLONG)Length;
  409.              }
  410.  
  411.              if ((FObj->PrivateCacheMap == NULL) ||
  412. -                (fo_fcb->IsFastIoPossible == FastIoIsNotPossible)) {
  413. -                retval = FALSE;
  414. -                goto done_release_resource;
  415. -            }
  416. -
  417. -            if (fo_fcb->AllocationSize.QuadPart < writepos_end.QuadPart) {
  418. +                (fo_fcb->IsFastIoPossible == FastIoIsNotPossible) ||
  419. +                (writepos_end.QuadPart > fo_fcb->AllocationSize.QuadPart)) {
  420.                  retval = FALSE;
  421.                  goto done_release_resource;
  422.              }
  423.          }
  424.  
  425.          if (fo_fcb->IsFastIoPossible == FastIoIsQuestionable) {
  426. -            PDEVICE_OBJECT RelatedDeviceObject;
  427. -            PFAST_IO_DISPATCH FastIoDispatch;
  428. -
  429. -            RelatedDeviceObject = IoGetRelatedDeviceObject(FObj);
  430. -            FastIoDispatch =
  431. +            PDEVICE_OBJECT RelatedDeviceObject = IoGetRelatedDeviceObject(FObj);
  432. +            PFAST_IO_DISPATCH FastIoDispatch =
  433.                  RelatedDeviceObject->DriverObject->FastIoDispatch;
  434. +            IO_STATUS_BLOCK ios;
  435.  
  436.              /* This should not happen... */
  437.              if (!((FastIoDispatch != NULL) &&
  438. @@ -345,8 +331,13 @@ FsRtlCopyWrite2(
  439.              }
  440.  
  441.              if (!FastIoDispatch->FastIoCheckIfPossible(FObj,
  442. -                    &writepos_start, Length, Wait, LockKey,
  443. -                    FALSE, &ios,
  444. +                ((FileOffset->QuadPart != (LONGLONG)-1)?
  445. +                    FileOffset:&fo_fcb->FileSize),
  446. +                Length,
  447. +                Wait,
  448. +                LockKey,
  449. +                FALSE,
  450. +                &ios,
  451.                  RelatedDeviceObject)) {
  452.                  retval = FALSE;
  453.                  goto done_release_resource;
  454. @@ -354,30 +345,39 @@ FsRtlCopyWrite2(
  455.          }
  456.  
  457.          if (writepos_end.QuadPart > fo_fcb->FileSize.QuadPart) {
  458. -            filesize_changed = TRUE;
  459. -            filesize_orig.QuadPart = fo_fcb->FileSize.QuadPart;
  460. -            validdatalength_orig.QuadPart =
  461. -                fo_fcb->ValidDataLength.QuadPart;
  462. -
  463. -            if ((writepos_end.HighPart != fo_fcb->FileSize.HighPart) &&
  464. -                (fo_fcb->PagingIoResource != NULL)) {
  465. -                (void)ExAcquireResourceExclusiveLite(
  466. -                    fo_fcb->PagingIoResource, TRUE);
  467. -                fo_fcb->FileSize.QuadPart = writepos_end.QuadPart;
  468. +            filesize_changed = true;
  469. +            filesize_orig = fo_fcb->FileSize;
  470. +            validdatalen_orig = fo_fcb->ValidDataLength;
  471. +
  472. +            if ((fo_fcb->FileSize.HighPart != writepos_end.HighPart) &&
  473. +                 (fo_fcb->PagingIoResource != NULL)) {
  474. +                (void)ExAcquireResourceExclusiveLite(fo_fcb->PagingIoResource, TRUE);
  475. +                fo_fcb->FileSize = writepos_end;
  476.                  ExReleaseResourceLite(fo_fcb->PagingIoResource);
  477.              }
  478.              else {
  479. -                fo_fcb->FileSize.QuadPart = writepos_end.QuadPart;
  480. +                fo_fcb->FileSize = writepos_end;
  481.              }
  482.          }
  483.  
  484. -        IoSetTopLevelIrp(TopLevelContext);
  485. +        IoSetTopLevelIrp((PIRP)TopLevelContext);
  486.  
  487.          retval = FALSE;
  488. -
  489.          __try {
  490. -            retval = CcCopyWrite(FObj, &writepos_start,
  491. -                Length, Wait, Buffer);
  492. +            if (writepos_start.QuadPart > fo_fcb->ValidDataLength.QuadPart) {
  493. +                retval = CcZeroData(FObj,
  494. +                    &fo_fcb->ValidDataLength,
  495. +                    &writepos_start,
  496. +                    Wait);
  497. +            }
  498. +
  499. +            if (retval) {
  500. +                retval = CcCopyWrite(FObj,
  501. +                    &writepos_start,
  502. +                    Length,
  503. +                    Wait,
  504. +                    Buffer);
  505. +            }
  506.          }
  507.          __except(EXCEPTION_EXECUTE_HANDLER) {
  508.          }
  509. @@ -385,29 +385,24 @@ FsRtlCopyWrite2(
  510.          IoSetTopLevelIrp(NULL);
  511.  
  512.          if (retval) {
  513. -            if (writepos_end.QuadPart >
  514. -                fo_fcb->ValidDataLength.QuadPart) {
  515. -                if ((writepos_end.HighPart !=
  516. -                    fo_fcb->ValidDataLength.HighPart) &&
  517. -                    (fo_fcb->PagingIoResource != NULL)) {
  518. -                    (void)ExAcquireResourceExclusiveLite(
  519. -                        fo_fcb->PagingIoResource, TRUE);
  520. -                    fo_fcb->ValidDataLength.QuadPart =
  521. -                        writepos_end.QuadPart;
  522. +            if (writepos_end.QuadPart > fo_fcb->ValidDataLength.QuadPart) {
  523. +                if ((fo_fcb->ValidDataLength.HighPart != writepos_end.HighPart) &&
  524. +                     (fo_fcb->PagingIoResource != NULL)) {
  525. +                    (void)ExAcquireResourceExclusiveLite(fo_fcb->PagingIoResource, TRUE);
  526. +                    fo_fcb->ValidDataLength = writepos_end;
  527.                      ExReleaseResourceLite(fo_fcb->PagingIoResource);
  528.                  }
  529.                  else {
  530. -                    fo_fcb->ValidDataLength.QuadPart =
  531. -                        writepos_end.QuadPart;
  532. +                    fo_fcb->ValidDataLength = writepos_end;
  533.                  }
  534.              }
  535.  
  536. -            SetFlag(FObj->Flags, FO_FILE_MODIFIED);
  537. +            FObj->Flags |= FO_FILE_MODIFIED;
  538.  
  539.              if (filesize_changed) {
  540.                  (*CcGetFileSizePointer(FObj)).QuadPart =
  541.                      writepos_end.QuadPart;
  542. -                SetFlag(FObj->Flags, FO_FILE_SIZE_CHANGED);
  543. +                FObj->Flags |= FO_FILE_SIZE_CHANGED;
  544.              }
  545.  
  546.              FObj->CurrentByteOffset.QuadPart =
  547. @@ -419,11 +414,8 @@ FsRtlCopyWrite2(
  548.                      (void)ExAcquireResourceExclusiveLite(
  549.                          fo_fcb->PagingIoResource, TRUE);
  550.                  }
  551. -
  552. -                fo_fcb->FileSize.QuadPart = filesize_orig.QuadPart;
  553. -                fo_fcb->ValidDataLength.QuadPart =
  554. -                    validdatalength_orig.QuadPart;
  555. -
  556. +                fo_fcb->FileSize = filesize_orig;
  557. +                fo_fcb->ValidDataLength = validdatalen_orig;
  558.                  if (fo_fcb->PagingIoResource != NULL) {
  559.                      ExReleaseResourceLite(fo_fcb->PagingIoResource);
  560.                  }
  561. @@ -431,17 +423,16 @@ FsRtlCopyWrite2(
  562.          }
  563.      }
  564.      else {
  565. +        ULONG writepos_start = 0L;
  566. +        ULONG writepos_end = 0L;
  567. +        ULONG filesize_orig = 0L;
  568. +        ULONG validdatalen_orig = 0L;
  569.          bool write_beyond4gb;
  570.  
  571. -        writepos_start.HighPart = 0;
  572. -        writepos_end.HighPart = 0;
  573. +        writepos_end = FileOffset->LowPart + Length;
  574.  
  575. -        if (append_file ||
  576. -            ((FileOffset->QuadPart + Length) >
  577. -                fo_fcb->ValidDataLength.QuadPart)) {
  578. -            (void)ExAcquireResourceExclusiveLite(fo_fcb->Resource,
  579. -                TRUE);
  580. -            fcb_resource_acquired_shared = false;
  581. +        if (append_file || (writepos_end > fo_fcb->ValidDataLength.LowPart)) {
  582. +            (void)ExAcquireResourceExclusiveLite(fo_fcb->Resource, TRUE);
  583.          }
  584.          else {
  585.              (void)ExAcquireResourceSharedLite(fo_fcb->Resource, TRUE);
  586. @@ -449,74 +440,63 @@ FsRtlCopyWrite2(
  587.          }
  588.  
  589.          if (append_file) {
  590. -            writepos_start.LowPart = fo_fcb->FileSize.LowPart;
  591. -            writepos_end.LowPart = writepos_start.LowPart + Length;
  592. +            writepos_start = fo_fcb->FileSize.LowPart;
  593. +            writepos_end = fo_fcb->FileSize.LowPart + Length;
  594.              write_beyond4gb =
  595. -                (writepos_end.LowPart < fo_fcb->FileSize.LowPart);
  596. +                writepos_end < fo_fcb->FileSize.LowPart;
  597.          }
  598.          else {
  599. -            writepos_start.LowPart = FileOffset->LowPart;
  600. -            writepos_end.LowPart = writepos_start.LowPart + Length;
  601. +            writepos_start = FileOffset->LowPart;
  602. +            writepos_end = FileOffset->LowPart + Length;
  603.              write_beyond4gb =
  604. -                (writepos_end.LowPart < FileOffset->LowPart) ||
  605. +                (writepos_end < FileOffset->LowPart) ||
  606.                  (FileOffset->HighPart != 0);
  607.          }
  608.  
  609.          if ((FObj->PrivateCacheMap == NULL) ||
  610. -            (fo_fcb->IsFastIoPossible == FastIoIsNotPossible)) {
  611. +            (fo_fcb->IsFastIoPossible == FastIoIsNotPossible) ||
  612. +            (writepos_end > fo_fcb->AllocationSize.LowPart)) {
  613.              retval = FALSE;
  614.              goto done_release_resource;
  615.          }
  616.  
  617.  #ifdef COPYSUP_MAX_HOLE_SIZE
  618. -        if (writepos_start.LowPart >=
  619. -                (fo_fcb->ValidDataLength.LowPart +
  620. -                    COPYSUP_MAX_HOLE_SIZE)) {
  621. +        if (writepos_start >=
  622. +            (fo_fcb->ValidDataLength.LowPart + COPYSUP_MAX_HOLE_SIZE)) {
  623.              retval = FALSE;
  624.              goto done_release_resource;
  625.          }
  626.  #endif /* COPYSUP_MAX_HOLE_SIZE */
  627.  
  628. -        if ((fo_fcb->AllocationSize.LowPart < writepos_end.LowPart) ||
  629. -            write_beyond4gb) {
  630. +        if ((fo_fcb->AllocationSize.HighPart != 0) || write_beyond4gb) {
  631.              retval = FALSE;
  632.              goto done_release_resource;
  633.          }
  634.  
  635. -        if (fcb_resource_acquired_shared &&
  636. -            (writepos_end.LowPart > fo_fcb->ValidDataLength.LowPart)) {
  637. +        if (fcb_resource_acquired_shared && (writepos_end > fo_fcb->ValidDataLength.LowPart)) {
  638.              ExReleaseResourceLite(fo_fcb->Resource);
  639. -            (void)ExAcquireResourceExclusiveLite(fo_fcb->Resource,
  640. -                TRUE);
  641. +            (void)ExAcquireResourceExclusiveLite(fo_fcb->Resource, TRUE);
  642.  
  643.              if (append_file) {
  644. -                writepos_start.LowPart = fo_fcb->FileSize.LowPart;
  645. -                writepos_end.LowPart = writepos_start.LowPart + Length;
  646. -                write_beyond4gb =
  647. -                    (writepos_end.LowPart < fo_fcb->FileSize.LowPart);
  648. +                writepos_start = fo_fcb->FileSize.LowPart;
  649. +                writepos_end = fo_fcb->FileSize.LowPart + Length;
  650. +                write_beyond4gb = writepos_end < fo_fcb->FileSize.LowPart;
  651.              }
  652.  
  653.              if ((FObj->PrivateCacheMap == NULL) ||
  654. -                (fo_fcb->IsFastIoPossible == FastIoIsNotPossible)) {
  655. -                retval = FALSE;
  656. -                goto done_release_resource;
  657. -            }
  658. -
  659. -            if (write_beyond4gb ||
  660. -                (fo_fcb->AllocationSize.LowPart < writepos_end.LowPart) ||
  661. -                (fo_fcb->AllocationSize.HighPart != 0)) {
  662. +                (fo_fcb->IsFastIoPossible == FastIoIsNotPossible) ||
  663. +                (writepos_end > fo_fcb->AllocationSize.LowPart) ||
  664. +                (fo_fcb->AllocationSize.HighPart != 0) || write_beyond4gb) {
  665.                  retval = FALSE;
  666.                  goto done_release_resource;
  667.              }
  668.          }
  669.  
  670.          if (fo_fcb->IsFastIoPossible == FastIoIsQuestionable) {
  671. -            PFAST_IO_DISPATCH FastIoDispatch;
  672. -            PDEVICE_OBJECT RelatedDeviceObject;
  673. -
  674. -            RelatedDeviceObject = IoGetRelatedDeviceObject(FObj);
  675. -            FastIoDispatch =
  676. +            PDEVICE_OBJECT RelatedDeviceObject = IoGetRelatedDeviceObject(FObj);
  677. +            PFAST_IO_DISPATCH FastIoDispatch =
  678.                  RelatedDeviceObject->DriverObject->FastIoDispatch;
  679. +            IO_STATUS_BLOCK ios;
  680.  
  681.              /* This should not happen... */
  682.              if (!((FastIoDispatch != NULL) &&
  683. @@ -526,29 +506,46 @@ FsRtlCopyWrite2(
  684.              }
  685.  
  686.              if (!FastIoDispatch->FastIoCheckIfPossible(FObj,
  687. -                &writepos_start, Length, Wait, LockKey,
  688. -                FALSE, &ios, RelatedDeviceObject)) {
  689. +                    ((FileOffset->QuadPart != (LONGLONG)-1)?
  690. +                        FileOffset:&fo_fcb->FileSize),
  691. +                    Length,
  692. +                    TRUE,
  693. +                    LockKey,
  694. +                    FALSE,
  695. +                    &ios,
  696. +                    RelatedDeviceObject)) {
  697.                  retval = FALSE;
  698.                  goto done_release_resource;
  699.              }
  700.          }
  701.  
  702. -        if (writepos_end.LowPart > fo_fcb->FileSize.LowPart) {
  703. +        if (writepos_end > fo_fcb->FileSize.LowPart) {
  704.              filesize_changed = true;
  705. -            filesize_orig.LowPart = fo_fcb->FileSize.LowPart;
  706. -            validdatalength_orig.LowPart =
  707. -                fo_fcb->ValidDataLength.LowPart;
  708. -            fo_fcb->FileSize.LowPart = writepos_end.LowPart;
  709. +            filesize_orig = fo_fcb->FileSize.LowPart;
  710. +            validdatalen_orig = fo_fcb->ValidDataLength.LowPart;
  711. +            fo_fcb->FileSize.LowPart = writepos_end;
  712.          }
  713.  
  714. -        IoSetTopLevelIrp(TopLevelContext);
  715. +        IoSetTopLevelIrp((PIRP)TopLevelContext);
  716.  
  717.          retval = FALSE;
  718. -
  719.          __try {
  720. -            CcFastCopyWrite(FObj, writepos_start.LowPart,
  721. -                Length, Buffer);
  722. -            retval = TRUE;
  723. +            if (writepos_start > fo_fcb->ValidDataLength.LowPart) {
  724. +                LARGE_INTEGER ZeroEnd = {
  725. +                    .LowPart = writepos_start,
  726. +                    .HighPart = 0L
  727. +                };
  728. +
  729. +                CcZeroData(FObj,
  730. +                    &fo_fcb->ValidDataLength,
  731. +                    &ZeroEnd,
  732. +                    TRUE);
  733. +            }
  734. +
  735. +            CcFastCopyWrite(FObj,
  736. +                writepos_start,
  737. +                Length,
  738. +                Buffer);
  739.          }
  740.          __except(EXCEPTION_EXECUTE_HANDLER) {
  741.          }
  742. @@ -556,20 +553,19 @@ FsRtlCopyWrite2(
  743.          IoSetTopLevelIrp(NULL);
  744.  
  745.          if (retval) {
  746. -            if (writepos_end.LowPart > fo_fcb->ValidDataLength.LowPart) {
  747. -                fo_fcb->ValidDataLength.LowPart = writepos_end.LowPart;
  748. +            if (writepos_end > fo_fcb->ValidDataLength.LowPart) {
  749. +                fo_fcb->ValidDataLength.LowPart = writepos_end;
  750.              }
  751.  
  752. -            SetFlag(FObj->Flags, FO_FILE_MODIFIED);
  753. +            FObj->Flags |= FO_FILE_MODIFIED;
  754.  
  755.              if (filesize_changed) {
  756. -                (*CcGetFileSizePointer(FObj)).LowPart =
  757. -                    writepos_end.LowPart;
  758. -                SetFlag(FObj->Flags, FO_FILE_SIZE_CHANGED);
  759. +                CcGetFileSizePointer(FObj)->LowPart = writepos_end;
  760. +                FObj->Flags |= FO_FILE_SIZE_CHANGED;
  761.              }
  762.  
  763.              FObj->CurrentByteOffset.LowPart =
  764. -                writepos_start.LowPart + Length;
  765. +                writepos_start + Length;
  766.              FObj->CurrentByteOffset.HighPart = 0;
  767.          }
  768.          else {
  769. @@ -578,10 +574,8 @@ FsRtlCopyWrite2(
  770.                      (void)ExAcquireResourceExclusiveLite(
  771.                          fo_fcb->PagingIoResource, TRUE);
  772.                  }
  773. -
  774. -                fo_fcb->FileSize.LowPart = filesize_orig.LowPart;
  775. -                fo_fcb->ValidDataLength.LowPart = validdatalength_orig.LowPart;
  776. -
  777. +                fo_fcb->FileSize.LowPart = filesize_orig;
  778. +                fo_fcb->ValidDataLength.LowPart = validdatalen_orig;
  779.                  if (fo_fcb->PagingIoResource != NULL) {
  780.                      ExReleaseResourceLite(fo_fcb->PagingIoResource);
  781.                  }
  782. @@ -596,7 +590,6 @@ done_exit_filesystem:
  783.  done:
  784.      return retval;
  785.  }
  786. -#endif /* defined(_ARM_) || defined(_ARM64_) */
  787.  
  788.  
  789.  #if defined(_ARM_) || defined(_ARM64_)
  790. --
  791. 2.45.1
  792.  
  793. From 409d6864e0aa92d54af002e9ab9f083dab3c5c26 Mon Sep 17 00:00:00 2001
  794. From: Roland Mainz <roland.mainz@nrubsig.org>
  795. Date: Thu, 10 Oct 2024 18:02:18 +0200
  796. Subject: [PATCH 5/5] build.vc19: Use our own implementation for
  797.  |FsRtlCopyRead2()|+|FsRtlCopyWrite2()|
  798.  
  799. Use our own implementation for |FsRtlCopyRead2()|+|FsRtlCopyWrite2()|
  800. to support ARM64 and Visual Studio 2022/WDK Win11, which
  801. miss copysup.lib
  802.  
  803. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  804. ---
  805. build.vc19/nfs41_driver/nfs41_driver.vcxproj | 8 ++++----
  806.  1 file changed, 4 insertions(+), 4 deletions(-)
  807.  
  808. diff --git a/build.vc19/nfs41_driver/nfs41_driver.vcxproj b/build.vc19/nfs41_driver/nfs41_driver.vcxproj
  809. index 1451084..3e0d25a 100644
  810. --- a/build.vc19/nfs41_driver/nfs41_driver.vcxproj
  811. +++ b/build.vc19/nfs41_driver/nfs41_driver.vcxproj
  812. @@ -172,7 +172,7 @@
  813.        <AdditionalOptions>/std:c17 /Zc:preprocessor- /kernel /wd4100 /wd4201 /wd5104</AdditionalOptions>
  814.      </ClCompile>
  815.      <Link>
  816. -      <AdditionalDependencies>$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ntoskrnl.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\hal.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\BufferOverflowfastfailK.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ksecdd.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rxce.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rdbsslib.lib;$(WindowsSdkDir)lib\win7\km\$(DDKPlatform)\copysup.lib</AdditionalDependencies>
  817. +      <AdditionalDependencies>$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ntoskrnl.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\hal.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\BufferOverflowfastfailK.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ksecdd.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rxce.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rdbsslib.lib</AdditionalDependencies>
  818.      </Link>
  819.    </ItemDefinitionGroup>
  820.    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
  821. @@ -186,7 +186,7 @@
  822.        <AdditionalOptions>/std:c17 /Zc:preprocessor- /kernel /wd4100 /wd4201 /wd5104</AdditionalOptions>
  823.      </ClCompile>
  824.      <Link>
  825. -      <AdditionalDependencies>$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ntoskrnl.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\hal.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\BufferOverflowfastfailK.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ksecdd.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rxce.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rdbsslib.lib;$(WindowsSdkDir)lib\win7\km\$(DDKPlatform)\copysup.lib</AdditionalDependencies>
  826. +      <AdditionalDependencies>$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ntoskrnl.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\hal.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\BufferOverflowfastfailK.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ksecdd.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rxce.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rdbsslib.lib</AdditionalDependencies>
  827.      </Link>
  828.    </ItemDefinitionGroup>
  829.    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
  830. @@ -228,7 +228,7 @@
  831.        <AdditionalOptions>/std:c17 /Zc:preprocessor- /kernel /wd4100 /wd4201 /wd5104</AdditionalOptions>
  832.      </ClCompile>
  833.      <Link>
  834. -      <AdditionalDependencies>$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ntoskrnl.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\hal.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\BufferOverflowfastfailK.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ksecdd.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rxce.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rdbsslib.lib;$(WindowsSdkDir)lib\win7\km\$(DDKPlatform)\copysup.lib</AdditionalDependencies>
  835. +      <AdditionalDependencies>$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ntoskrnl.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\hal.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\BufferOverflowfastfailK.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ksecdd.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rxce.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rdbsslib.lib</AdditionalDependencies>
  836.      </Link>
  837.    </ItemDefinitionGroup>
  838.    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
  839. @@ -242,7 +242,7 @@
  840.        <AdditionalOptions>/std:c17 /Zc:preprocessor- /kernel /wd4100 /wd4201 /wd5104</AdditionalOptions>
  841.      </ClCompile>
  842.      <Link>
  843. -      <AdditionalDependencies>$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ntoskrnl.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\hal.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\BufferOverflowfastfailK.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ksecdd.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rxce.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rdbsslib.lib;$(WindowsSdkDir)lib\win7\km\$(DDKPlatform)\copysup.lib</AdditionalDependencies>
  844. +      <AdditionalDependencies>$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ntoskrnl.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\hal.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\BufferOverflowfastfailK.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\ksecdd.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rxce.lib;$(WindowsSdkDir)lib0.0.19041.0\km\$(DDKPlatform)\rdbsslib.lib</AdditionalDependencies>
  845.      </Link>
  846.    </ItemDefinitionGroup>
  847.    <ItemGroup>
  848. --
  849. 2.45.1

Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:

To highlight particular lines, prefix each line with {%HIGHLIGHT}




All content is user-submitted.
The administrators of this site (kpaste.net) are not responsible for their content.
Abuse reports should be emailed to us at