亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? smbproto.c

?? Sanos Operating System Kernel ----------------------------- Sanos is an OS kernel for use in PC base
?? C
?? 第 1 頁 / 共 2 頁
字號:
//
// smbproto.c
//
// SMB protocol
//
// Copyright (C) 2002 Michael Ringgaard. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 
// 1. Redistributions of source code must retain the above copyright 
//    notice, this list of conditions and the following disclaimer.  
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.  
// 3. Neither the name of the project nor the names of its contributors
//    may be used to endorse or promote products derived from this software
//    without specific prior written permission. 
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
// SUCH DAMAGE.
// 

#include <os/krnl.h>
#include "smb.h"

struct smb_server *servers = NULL;

struct smb *smb_init(struct smb_share *share, int aux)
{
  struct smb *smb;
  
  if (aux)
    smb = (struct smb *) share->server->auxbuf;
  else
    smb = (struct smb *) share->server->buffer;

  memset(smb, 0, sizeof(struct smb));
  return smb;
}

int smb_send(struct smb_share *share, struct smb *smb, unsigned char cmd, int params, char *data, int datasize)
{
  int len;
  int rc;
  char *p;

  len = SMB_HEADER_LEN + params * 2 + 2 + datasize;

  smb->len[0] = (len > 0xFF000000) >> 24;
  smb->len[1] = (len > 0xFF0000) >> 16;
  smb->len[2] = (len & 0xFF00) >> 8;
  smb->len[3] = (len & 0xFF);
    
  smb->protocol[0] = 0xFF;
  smb->protocol[1] = 'S';
  smb->protocol[2] = 'M';
  smb->protocol[3] = 'B';

  smb->cmd = cmd;
  smb->tid = share->tid;
  smb->uid = share->server->uid;
  smb->wordcount = (unsigned char) params;
  smb->flags = (1 << 3);
  smb->flags2 = 1;

  p = (char *) smb->params.words + params * 2;
  *((unsigned short *) p) = (unsigned short) datasize;
  if (datasize) memcpy(p + 2, data, datasize);

  rc = send(share->server->sock, (char *) smb, len + 4, 0);
  if (rc < 0) return rc;
  if (rc != len + 4) return -EIO;

  return 0;
}

int smb_recv(struct smb_share *share, struct smb *smb)
{
  int len;
  int rc;

  rc = recv_fully(share->server->sock, (char *) smb, 4, 0);
  if (rc < 0) return rc;
  if (rc != 4) return -EIO;

  len = smb->len[3] | (smb->len[2] << 8) | (smb->len[1] << 16) | (smb->len[0] << 24);
  if (len < 4 || len > SMB_MAX_BUFFER) return -EMSGSIZE;

  rc = recv_fully(share->server->sock, (char *) &smb->protocol, len, 0);
  if (rc < 0) return rc;
  if (rc != len) return -EIO;
  if (smb->protocol[0] != 0xFF || smb->protocol[1] != 'S' || smb->protocol[2] != 'M' || smb->protocol[3] != 'B') return -EPROTO;
  if (smb->error_class != SMB_SUCCESS) return smb_errno(smb);

  return 0;
}

int smb_request(struct smb_share *share, struct smb *smb, unsigned char cmd, int params, char *data, int datasize, int retry)
{
  int rc;

  if (retry)
  {
    rc = smb_check_connection(share);
    if (rc < 0) return rc;
  }

  rc = smb_send(share, smb, cmd, params, data, datasize);
  if ((rc == -ECONN || rc == -ERST) && retry)
  {
    rc = smb_reconnect(share);
    if (rc < 0) return rc;

    rc = smb_send(share, smb, cmd, params, data, datasize);
    if (rc < 0) return rc;
  }
  else
  {
    if (rc < 0) return rc;
  }

  rc = smb_recv(share, smb);
  if (rc < 0) return rc;

  return 0;
}

int smb_trans_send(struct smb_share *share, unsigned short cmd, 
		   void *params, int paramlen,
		   void *data, int datalen,
		   int maxparamlen, int maxdatalen)
{
  struct smb *smb;
  int wordcount = 15;
  int paramofs = ROUNDUP(SMB_HEADER_LEN + 2 * wordcount + 2 + 3);
  int dataofs =	ROUNDUP(paramofs + paramlen);
  int bcc = dataofs + datalen - (SMB_HEADER_LEN + 2 * wordcount + 2);
  int len = SMB_HEADER_LEN + 2 * wordcount + 2 + bcc;
  char *p;
  int rc;

  rc = smb_check_connection(share);
  if (rc < 0) return rc;

  smb = (struct smb *) share->server->buffer;
  memset(smb, 0, sizeof(struct smb));

  smb->len[0] = (len > 0xFF000000) >> 24;
  smb->len[1] = (len > 0xFF0000) >> 16;
  smb->len[2] = (len & 0xFF00) >> 8;
  smb->len[3] = (len & 0xFF);
    
  smb->protocol[0] = 0xFF;
  smb->protocol[1] = 'S';
  smb->protocol[2] = 'M';
  smb->protocol[3] = 'B';

  smb->cmd = SMB_COM_TRANSACTION2;
  smb->tid = share->tid;
  smb->uid = share->server->uid;
  smb->wordcount = wordcount;
  smb->flags = (1 << 3);
  smb->flags2 = 1;

  smb->params.req.trans.total_parameter_count = paramlen;
  smb->params.req.trans.total_data_count = datalen;
  smb->params.req.trans.max_parameter_count = maxparamlen;
  smb->params.req.trans.max_data_count = maxdatalen;
  smb->params.req.trans.max_setup_count = 0;
  smb->params.req.trans.parameter_count = paramlen;
  smb->params.req.trans.parameter_offset = paramofs; 
  smb->params.req.trans.data_count = datalen;
  smb->params.req.trans.data_offset = dataofs;
  smb->params.req.trans.setup_count = 1;
  smb->params.req.trans.setup[0] = cmd;

  p = (char *) smb->params.words + wordcount * 2;
  *((unsigned short *) p) = (unsigned short) bcc;

  p = (char *) smb + 4;

  if (params) memcpy(p + paramofs, params, paramlen);
  if (data) memcpy(p + dataofs, data, datalen);

  rc = send(share->server->sock, (char *) smb, len + 4, 0);
  if (rc == -ECONN || rc == -ERST)
  {
    rc = smb_reconnect(share);
    if (rc < 0) return rc;

    rc = send(share->server->sock, (char *) smb, len + 4, 0);
    if (rc < 0) return rc;
    if (rc != len + 4) return -EIO;
  }
  else
  {
    if (rc < 0) return rc;
    if (rc != len + 4) return -EIO;
  }

  return 0;
}

int smb_trans_recv(struct smb_share *share,
		   void *params, int *paramlen,
		   void *data, int *datalen)
{
  struct smb *smb;
  int paramofs, paramdisp, paramcnt;
  int dataofs, datadisp, datacnt;
  int rc;

  while (1)
  {
    // Receive next block
    smb = (struct smb *) share->server->buffer;
    rc = smb_recv(share, smb);
    if (rc < 0) return rc;

    // Copy parameters
    paramofs = smb->params.rsp.trans.parameter_offset;
    paramdisp = smb->params.rsp.trans.parameter_displacement;
    paramcnt = smb->params.rsp.trans.parameter_count;
    if (params)
    {
      if (paramdisp + paramcnt > *paramlen) return -EBUF;
      if (paramcnt) memcpy((char *) params + paramdisp, (char *) smb + paramofs + 4, paramcnt);
    }

    // Copy data
    dataofs = smb->params.rsp.trans.data_offset;
    datadisp = smb->params.rsp.trans.data_displacement;
    datacnt = smb->params.rsp.trans.data_count;
    if (data)
    {
      if (datadisp + datacnt > *datalen) return -EBUF;
      if (datacnt) memcpy((char *) data + datadisp, (char *) smb + dataofs + 4, datacnt);
    }

    // Check for last block
    if (paramdisp + paramcnt == smb->params.rsp.trans.total_parameter_count &&
        datadisp + datacnt == smb->params.rsp.trans.total_data_count)
    {
      *paramlen = smb->params.rsp.trans.total_parameter_count;
      *datalen = smb->params.rsp.trans.total_data_count;
      return 0;
    }
  }
}

int smb_trans(struct smb_share *share,
	      unsigned short cmd, 
	      void *reqparams, int reqparamlen,
	      void *reqdata, int reqdatalen,
	      void *rspparams, int *rspparamlen,
	      void *rspdata, int *rspdatalen)
{
  int rc;
  int dummyparamlen;
  int dummydatalen;

  if (!rspparamlen) 
  {
    dummyparamlen = 0;
    rspparamlen = &dummyparamlen;
  }

  if (!rspdatalen) 
  {
    dummydatalen = 0;
    rspdatalen = &dummydatalen;
  }

  rc = smb_trans_send(share, cmd, reqparams, reqparamlen, reqdata, reqdatalen, *rspparamlen, *rspdatalen);
  if (rc < 0) return rc;

  rc = smb_trans_recv(share, rspparams, rspparamlen, rspdata, rspdatalen);
  if (rc == -ERST)
  {
    rc = smb_reconnect(share);
    if (rc < 0) return rc;

    rc = smb_trans_send(share, cmd, reqparams, reqparamlen, reqdata, reqdatalen, *rspparamlen, *rspdatalen);
    if (rc < 0) return rc;

    rc = smb_trans_recv(share, rspparams, rspparamlen, rspdata, rspdatalen);
  }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区免费在线| 7777精品伊人久久久大香线蕉的| 日韩午夜激情视频| 美腿丝袜亚洲一区| 日韩精品一区二区三区蜜臀| 国产综合色视频| 久久婷婷国产综合精品青草| 粉嫩高潮美女一区二区三区| 国产精品网友自拍| 91美女视频网站| 亚洲图片欧美色图| 欧美成人一区二区三区 | 亚洲免费在线观看| 波多野结衣在线aⅴ中文字幕不卡| 综合久久国产九一剧情麻豆| 99r国产精品| 日韩精品亚洲一区二区三区免费| 日韩欧美在线123| 国产精品一区免费视频| 亚洲欧美一区二区不卡| 在线成人小视频| 国产成人精品三级麻豆| 亚洲乱码国产乱码精品精的特点| 欧美精选午夜久久久乱码6080| 麻豆精品精品国产自在97香蕉| 国产亚洲一区二区在线观看| 日本精品一区二区三区四区的功能| 亚洲成人1区2区| 久久久久久麻豆| 欧美性三三影院| 国产成人亚洲综合a∨猫咪| 一区二区三区在线视频观看58| 日韩欧美国产一二三区| 成年人午夜久久久| 蜜臀av一级做a爰片久久| 国产精品色眯眯| 欧美一区二区视频观看视频| 不卡一区二区三区四区| 天堂在线亚洲视频| 中文字幕巨乱亚洲| 日韩视频一区在线观看| 91.成人天堂一区| 东方欧美亚洲色图在线| 免费精品99久久国产综合精品| 中文av字幕一区| 日韩免费一区二区三区在线播放| 96av麻豆蜜桃一区二区| 国产一区二区三区黄视频| 亚洲一区免费视频| 亚洲国产成人午夜在线一区| 91精品国产一区二区三区香蕉| 成人听书哪个软件好| 美女看a上一区| 亚洲一区二区三区美女| 国产精品久久久久久久久免费相片| 欧美一区二区视频在线观看 | 不卡高清视频专区| 久久99久国产精品黄毛片色诱| 夜色激情一区二区| 国产精品乱码久久久久久| 精品国产一区二区国模嫣然| 欧美精品免费视频| 欧美写真视频网站| 91丨国产丨九色丨pron| 久久欧美中文字幕| 一区二区三区精品在线| 狠狠色丁香婷婷综合久久片| 亚洲一区二区综合| 专区另类欧美日韩| 中文字幕日韩一区| 欧美激情资源网| 国产欧美一区二区精品秋霞影院| 日韩女优电影在线观看| 欧美一区二区福利在线| 在线观看91av| 欧美一级艳片视频免费观看| 51精品秘密在线观看| 欧美写真视频网站| 欧美人与禽zozo性伦| 欧美精品久久久久久久久老牛影院| 在线一区二区三区四区| 色妞www精品视频| 日本道精品一区二区三区| 色综合视频一区二区三区高清| 91麻豆国产自产在线观看| 91最新地址在线播放| 91丨porny丨国产入口| 91毛片在线观看| 91黄色在线观看| 欧美三级日韩在线| 欧美一级欧美一级在线播放| 欧美xxxx在线观看| 2024国产精品| 国产精品理论片在线观看| 国产精品情趣视频| 亚洲激情综合网| 欧美亚洲自拍偷拍| 欧美高清视频一二三区 | 国产999精品久久久久久绿帽| 国产精品夜夜爽| 97久久精品人人做人人爽| 91蝌蚪porny九色| 欧美日韩大陆一区二区| 欧美大片拔萝卜| 欧美经典一区二区| 亚洲一区二区三区国产| jlzzjlzz欧美大全| 成人激情动漫在线观看| av电影在线观看一区| 91久久精品一区二区三| 欧美伊人精品成人久久综合97 | 国产精品久久久久国产精品日日| 久久免费偷拍视频| 亚洲人成伊人成综合网小说| 麻豆91在线播放免费| 精品国产一区二区三区久久久蜜月| 精品亚洲成a人在线观看| 综合电影一区二区三区 | 欧美日韩另类一区| 精品国产伦一区二区三区观看体验| 欧美国产精品中文字幕| 亚洲在线视频一区| 激情av综合网| 在线亚洲+欧美+日本专区| 欧美成人国产一区二区| 一区二区三区四区高清精品免费观看| 美女网站色91| 91福利精品视频| 国产欧美日韩另类一区| 视频在线观看一区| 99国产精品一区| 精品成人一区二区三区四区| 一区二区三区四区不卡视频| 国产一区二区精品久久91| 欧美日韩国产综合一区二区| 国产片一区二区三区| 日韩黄色在线观看| 一本色道综合亚洲| 国产欧美日韩激情| 久久99精品一区二区三区三区| 日本精品一区二区三区高清| 欧美国产日韩在线观看| 美女在线视频一区| 欧美日韩一卡二卡三卡| 亚洲欧美日韩国产一区二区三区| 国内精品伊人久久久久影院对白| 欧美天天综合网| 亚洲日本在线a| 国产福利一区二区三区| 午夜国产不卡在线观看视频| 99热精品国产| 国产精品天干天干在线综合| 精品一区二区综合| 日韩欧美国产一区二区三区| 午夜精品久久久久影视| 在线一区二区三区| 亚洲欧美日韩久久| 91一区二区三区在线播放| 国产欧美一区二区精品性| 久久精品国产亚洲高清剧情介绍 | 91啪亚洲精品| 国产精品美女久久久久av爽李琼| 国产福利一区在线| 成人欧美一区二区三区黑人麻豆 | 久久亚洲精品小早川怜子| 奇米精品一区二区三区四区| 制服丝袜日韩国产| 国产成人精品一区二| 亚洲一区免费观看| 欧美高清激情brazzers| 精品久久久久久亚洲综合网| 国产一区在线观看视频| 五月天丁香久久| 午夜久久久久久久久| 欧美日韩久久不卡| 国产精品无遮挡| 欧美优质美女网站| 7777精品伊人久久久大香线蕉完整版| 欧美精品一区二区久久久| 国产嫩草影院久久久久| 中文字幕制服丝袜成人av| 成人激情开心网| 亚洲精品久久嫩草网站秘色| 欧美亚州韩日在线看免费版国语版| 亚洲伊人伊色伊影伊综合网| 欧美系列在线观看| 日本aⅴ精品一区二区三区| 欧美va在线播放| 成人永久免费视频| 一区二区三区四区蜜桃| 欧美精品少妇一区二区三区| 秋霞影院一区二区| 久久久一区二区| 97se亚洲国产综合自在线不卡| 亚洲影视资源网| 精品久久久三级丝袜| 波多野结衣91| 性感美女久久精品| 久久久久国产一区二区三区四区| 精品国产乱码久久久久久久|