smbtrans2client.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "headers.h"
  2. static SmbTransactionMethod method = {
  3. .encodeprimary = smbtransactionencodeprimary2,
  4. .sendrequest = smbtransactionclientsend,
  5. .receiveresponse = smbtransactionclientreceive,
  6. .decoderesponse = smbtransactiondecoderesponse2,
  7. };
  8. int
  9. smbclienttrans2(SmbClient *c, uchar scount, ushort *setup, SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata, SmbHeader *rh, char **errmsgp)
  10. {
  11. SmbTransaction transaction;
  12. SmbHeader h;
  13. memset(&transaction, 0, sizeof(transaction));
  14. transaction.in.scount = scount;
  15. transaction.in.setup = setup;
  16. transaction.in.parameters = smbbufferreadpointer(inparam);
  17. transaction.in.tpcount = smbbufferreadspace(inparam);
  18. transaction.in.maxpcount = smbbufferwritespace(outparam);
  19. transaction.in.maxdcount = smbbufferwritespace(outdata);
  20. transaction.out.parameters = outparam;
  21. transaction.out.data = outdata;
  22. h = c->protoh;
  23. h.tid = c->sharetid;
  24. h.mid = 0;
  25. return smbtransactionexecute(&transaction, &h, &c->peerinfo, c->b, &method, c, rh, errmsgp);
  26. }
  27. int
  28. smbclienttrans2findfirst2(SmbClient *c, ushort searchcount, char *filename,
  29. ushort *sidp, ushort *searchcountp, ushort *endofsearchp,SmbFindFileBothDirectoryInfo *ip, char **errmsgp)
  30. {
  31. int rv;
  32. ushort setup;
  33. SmbBuffer *inparam;
  34. SmbBuffer *outparam;
  35. SmbBuffer *outdata;
  36. SmbHeader rh;
  37. setup = SMB_TRANS2_FIND_FIRST2;
  38. inparam = smbbuffernew(512);
  39. smbbufferputs(inparam, 0x16);
  40. smbbufferputs(inparam, searchcount);
  41. smbbufferputs(inparam, 7);
  42. smbbufferputs(inparam, SMB_FIND_FILE_BOTH_DIRECTORY_INFO);
  43. smbbufferputl(inparam, 0);
  44. smbbufferputstring(inparam, &c->peerinfo, 0, filename);
  45. outparam = smbbuffernew(10);
  46. outdata = smbbuffernew(65535);
  47. rv = smbclienttrans2(c, 1, &setup, inparam, outparam, outdata, &rh, errmsgp);
  48. smbbufferfree(&inparam);
  49. if (rv) {
  50. ushort eaerroroffset, lastnameoffset;
  51. ulong nextentry;
  52. int i;
  53. if (!smbbuffergets(outparam, sidp)
  54. || !smbbuffergets(outparam, searchcountp)
  55. || !smbbuffergets(outparam, endofsearchp)
  56. || !smbbuffergets(outparam, &eaerroroffset)
  57. || !smbbuffergets(outparam, &lastnameoffset)) {
  58. smbstringprint(errmsgp, "smbclienttrans2findfirst2: not enough parameters returned");
  59. rv = 0;
  60. goto done;
  61. }
  62. nextentry = 0;
  63. smblogprint(-1, "returned data:\n");
  64. smblogdata(-1, smblogprint, smbbufferreadpointer(outdata), smbbufferreadspace(outdata), 256);
  65. for (i = 0; i < *searchcountp; i++) {
  66. SmbFindFileBothDirectoryInfo *info = ip + i;
  67. ulong neo, filenamelength, easize;
  68. uchar shortnamelength;
  69. if (i && !smbbufferreadskipto(outdata, nextentry)) {
  70. underflow:
  71. smbstringprint(errmsgp, "smbclientrans2findfirst2: not enough data returned");
  72. rv = 0;
  73. goto done;
  74. }
  75. if (!smbbuffergetl(outdata, &neo))
  76. goto underflow;
  77. nextentry = smbbufferreadoffset(outdata) + neo - 4;
  78. print("neo 0x%.8lux\n", neo);
  79. if (!smbbuffergetl(outdata, &info->fileindex)
  80. || !smbbuffergetv(outdata, &info->creationtime)
  81. || !smbbuffergetv(outdata, &info->lastaccesstime)
  82. || !smbbuffergetv(outdata, &info->lastwritetime)
  83. || !smbbuffergetv(outdata, &info->changetime)
  84. || !smbbuffergetv(outdata, &info->endoffile)
  85. || !smbbuffergetv(outdata, &info->allocationsize))
  86. goto underflow;
  87. print("got here\n");
  88. if (!smbbuffergetl(outdata, &info->extfileattributes)
  89. || !smbbuffergetl(outdata, &filenamelength)
  90. || !smbbuffergetl(outdata, &easize)
  91. || !smbbuffergetb(outdata, &shortnamelength)
  92. || !smbbuffergetbytes(outdata, nil, 1)
  93. || !smbbuffergetbytes(outdata, nil, 24)
  94. || !smbbuffergetstring(outdata, &rh, SMB_STRING_REVPATH, &info->filename))
  95. goto underflow;
  96. print("got here as well\n");
  97. }
  98. }
  99. done:
  100. smbbufferfree(&outparam);
  101. smbbufferfree(&outdata);
  102. return rv;
  103. }