|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1993 - Colorado Memory Systems, Inc.
4: All Rights Reserved
5:
6: Module Name:
7:
8: writtape.c
9:
10: Abstract:
11:
12: Copies 'howmany' bytes of data from 'fromwhere' to track memory and
13: calls NewTrkBk when a track fills up.
14:
15: Revision History:
16:
17:
18:
19:
20: --*/
21:
22: #include <ntddk.h>
23: #include <ntddtape.h>
24: #include "common.h"
25: #include "q117.h"
26: #include "protos.h"
27:
28:
29: STATUS
30: q117WriteTape(
31: IN PVOID FromWhere,
32: IN OUT ULONG HowMany,
33: IN OUT PQ117_CONTEXT Context
34: )
35:
36: /*++
37:
38: Routine Description:
39:
40: This routine disperses the incomming data into the segment buffers,
41: for storage on tape.
42:
43:
44: Arguments:
45:
46: FromWhere - Pointer data to store on tape
47:
48: HowMany - Howmany bytes to store
49:
50: Context - Context of driver
51:
52: Return Value:
53:
54: Any Driver error, NoErr, LinkBack.
55:
56: --*/
57:
58: {
59: STATUS retval;
60:
61: retval = NoErr;
62:
63: while (HowMany && retval == NoErr) {
64:
65: if (Context->CurrentOperation.SegmentBytesRemaining == 0) {
66:
67: //
68: // Any Driver error, NoErr, LinkBack. Queue up data and set
69: // CurrentOperation.SegmentBytesRemaining and
70: // CurrentOperation.SegmentPointer to the next free buffer.
71: //
72:
73: retval = q117NewTrkBk(Context);
74:
75: }
76:
77: if (!retval) {
78:
79: if (HowMany >
80: (ULONG)Context->CurrentOperation.SegmentBytesRemaining) {
81:
82: if (FromWhere) {
83:
84: RtlMoveMemory(
85: Context->CurrentOperation.SegmentPointer,
86: FromWhere,
87: Context->CurrentOperation.SegmentBytesRemaining);
88:
89: (PUCHAR)FromWhere +=
90: Context->CurrentOperation.SegmentBytesRemaining;
91:
92: }
93:
94: HowMany -= Context->CurrentOperation.SegmentBytesRemaining;
95:
96: Context->CurrentOperation.BytesOnTape +=
97: Context->CurrentOperation.SegmentBytesRemaining;
98:
99: Context->CurrentOperation.SegmentBytesRemaining = 0;
100:
101: } else {
102:
103: if (FromWhere) {
104:
105: RtlMoveMemory(
106: Context->CurrentOperation.SegmentPointer,
107: FromWhere,
108: HowMany);
109:
110: }
111:
112: (PUCHAR)Context->CurrentOperation.SegmentPointer += HowMany;
113:
114: Context->CurrentOperation.BytesOnTape += HowMany;
115:
116: Context->CurrentOperation.SegmentBytesRemaining -=
117: (USHORT)HowMany;
118:
119: HowMany = 0;
120: }
121: }
122: }
123:
124: if (Context->CurrentOperation.CurrentSegment >=
125: (Context->CurrentOperation.LastSegment-SEGMENTS_OF_EARLY_WARNING) &&
126: retval == NoErr ) {
127:
128: //
129: // When early warning zone is reached, return early warning error.
130: //
131: retval = EarlyWarning;
132:
133: }
134:
135: return(retval);
136: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.